diff --git a/.github/workflows/test_workflow.yml b/.github/workflows/test_workflow.yml index 27c052591..dda78c7f1 100644 --- a/.github/workflows/test_workflow.yml +++ b/.github/workflows/test_workflow.yml @@ -191,6 +191,13 @@ jobs: name: signal-safety-violation-glibc-${{ matrix.java_version }}-${{ matrix.config }}-amd64 path: /tmp/signal-safety-violation.txt if-no-files-found: ignore + - name: Upload ASan logs + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + if: failure() && matrix.config == 'asan' + with: + name: asan-logs-glibc-${{ matrix.java_version }}-amd64 + path: /tmp/asan.log.* + if-no-files-found: ignore test-linux-musl-amd64: needs: [cache-jdks, filter-musl-configs] @@ -317,6 +324,13 @@ jobs: name: signal-safety-violation-musl-${{ matrix.java_version }}-${{ matrix.config }}-amd64 path: /tmp/signal-safety-violation.txt if-no-files-found: ignore + - name: Upload ASan logs + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + if: failure() && matrix.config == 'asan' + with: + name: asan-logs-musl-${{ matrix.java_version }}-amd64 + path: /tmp/asan.log.* + if-no-files-found: ignore test-linux-glibc-aarch64: needs: cache-jdks @@ -495,6 +509,13 @@ jobs: name: signal-safety-violation-glibc-${{ matrix.java_version }}-${{ matrix.config }}-aarch64 path: /tmp/signal-safety-violation.txt if-no-files-found: ignore + - name: Upload ASan logs + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + if: failure() && matrix.config == 'asan' + with: + name: asan-logs-glibc-${{ matrix.java_version }}-aarch64 + path: /tmp/asan.log.* + if-no-files-found: ignore test-linux-musl-aarch64: needs: [cache-jdks, filter-musl-configs] @@ -599,3 +620,10 @@ jobs: name: signal-safety-violation-musl-${{ matrix.java_version }}-${{ matrix.config }}-aarch64 path: /tmp/signal-safety-violation.txt if-no-files-found: ignore + - name: Upload ASan logs + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + if: failure() && matrix.config == 'asan' + with: + name: asan-logs-musl-${{ matrix.java_version }}-aarch64 + path: /tmp/asan.log.* + if-no-files-found: ignore diff --git a/build-logic/conventions/src/main/kotlin/com/datadoghq/native/config/ConfigurationPresets.kt b/build-logic/conventions/src/main/kotlin/com/datadoghq/native/config/ConfigurationPresets.kt index b2be2b586..6bad44f91 100644 --- a/build-logic/conventions/src/main/kotlin/com/datadoghq/native/config/ConfigurationPresets.kt +++ b/build-logic/conventions/src/main/kotlin/com/datadoghq/native/config/ConfigurationPresets.kt @@ -211,7 +211,7 @@ object ConfigurationPresets { if (libasan != null) { config.testEnvironment.apply { put("LD_PRELOAD", libasan) - put("ASAN_OPTIONS", "allocator_may_return_null=1:unwind_abort_on_malloc=1:use_sigaltstack=0:detect_stack_use_after_return=0:handle_segv=0:halt_on_error=0:abort_on_error=0:print_stacktrace=1:symbolize=1:suppressions=$rootDir/gradle/sanitizers/asan.supp") + put("ASAN_OPTIONS", "allocator_may_return_null=1:unwind_abort_on_malloc=1:use_sigaltstack=0:detect_stack_use_after_return=0:handle_segv=0:halt_on_error=0:abort_on_error=0:print_stacktrace=1:symbolize=1:log_path=/tmp/asan.log:suppressions=$rootDir/gradle/sanitizers/asan.supp") put("UBSAN_OPTIONS", "halt_on_error=0:abort_on_error=0:print_stacktrace=1:suppressions=$rootDir/gradle/sanitizers/ubsan.supp") put("LSAN_OPTIONS", "detect_leaks=0") } diff --git a/ddprof-lib/src/main/cpp/buffers.h b/ddprof-lib/src/main/cpp/buffers.h index 098752258..700a802bc 100644 --- a/ddprof-lib/src/main/cpp/buffers.h +++ b/ddprof-lib/src/main/cpp/buffers.h @@ -80,6 +80,7 @@ class Buffer { _data[_offset++] = v; } + __attribute__((no_sanitize("undefined"))) __attribute__((no_sanitize("bounds"))) void put16(short v) { assert(_offset + 2 < limit()); diff --git a/ddprof-lib/src/main/cpp/callTraceStorage.h b/ddprof-lib/src/main/cpp/callTraceStorage.h index 4735e18f2..7affe9ca3 100644 --- a/ddprof-lib/src/main/cpp/callTraceStorage.h +++ b/ddprof-lib/src/main/cpp/callTraceStorage.h @@ -34,7 +34,7 @@ class CallTraceStorage { // Reserved trace ID for dropped samples due to contention // Real trace IDs are generated as (instance_id << 32) | slot, where instance_id starts from 1 // Any ID with 0 in upper 32 bits is guaranteed to not clash with real trace IDs - static const u64 DROPPED_TRACE_ID = 1ULL; + static constexpr u64 DROPPED_TRACE_ID = 1ULL; // Static dropped trace object that appears in JFR constant pool static CallTrace* getDroppedTrace();