Skip to content

Commit

Permalink
[LLVM] Make sanitizers respect the disable_santizer_instrumentation a…
Browse files Browse the repository at this point in the history
…ttribute. (#91732)

`disable_sanitizer_instrumetation` is attached to functions that shall
not be instrumented e.g. ifunc resolver because those run before
everything is initialised.
Some sanitizer already handles this attribute, this patch adds it to
DataFLow and Coverage too.
  • Loading branch information
DanielKristofKiss authored May 15, 2024
1 parent d6ee7e8 commit 45726c1
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 1 deletion.
3 changes: 2 additions & 1 deletion llvm/lib/Transforms/Instrumentation/DataFlowSanitizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1546,7 +1546,8 @@ bool DataFlowSanitizer::runImpl(
SmallPtrSet<Constant *, 1> PersonalityFns;
for (Function &F : M)
if (!F.isIntrinsic() && !DFSanRuntimeFunctions.contains(&F) &&
!LibAtomicFunction(F)) {
!LibAtomicFunction(F) &&
!F.hasFnAttribute(Attribute::DisableSanitizerInstrumentation)) {
FnsToInstrument.push_back(&F);
if (F.hasPersonalityFn())
PersonalityFns.insert(F.getPersonalityFn()->stripPointerCasts());
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -631,6 +631,8 @@ void ModuleSanitizerCoverage::instrumentFunction(Function &F) {
return;
if (F.hasFnAttribute(Attribute::NoSanitizeCoverage))
return;
if (F.hasFnAttribute(Attribute::DisableSanitizerInstrumentation))
return;
if (Options.CoverageType >= SanitizerCoverageOptions::SCK_Edge) {
SplitAllCriticalEdges(
F, CriticalEdgeSplittingOptions().setIgnoreUnreachableDests());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@

; This test checks that we are not instrumenting sanitizer code.
; RUN: opt < %s -passes='module(msan)' -S | FileCheck %s

target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

; Function with sanitize_memory is instrumented.
; Function Attrs: nounwind uwtable
define void @instr_sa(ptr %a) sanitize_memory {
entry:
%tmp1 = load i32, ptr %a, align 4
%tmp2 = add i32 %tmp1, 1
store i32 %tmp2, ptr %a, align 4
ret void
}

; CHECK-LABEL: @instr_sa
; CHECK: %0 = load i64, ptr @__msan_param_tls


; Function with disable_sanitizer_instrumentation is not instrumented.
; Function Attrs: nounwind uwtable
define void @noinstr_dsi(ptr %a) disable_sanitizer_instrumentation {
entry:
%tmp1 = load i32, ptr %a, align 4
%tmp2 = add i32 %tmp1, 1
store i32 %tmp2, ptr %a, align 4
ret void
}

; CHECK-LABEL: @noinstr_dsi
; CHECK-NOT: %0 = load i64, ptr @__msan_param_tls


; disable_sanitizer_instrumentation takes precedence over sanitize_memory.
; Function Attrs: nounwind uwtable
define void @noinstr_dsi_sa(ptr %a) disable_sanitizer_instrumentation sanitize_memory {
entry:
%tmp1 = load i32, ptr %a, align 4
%tmp2 = add i32 %tmp1, 1
store i32 %tmp2, ptr %a, align 4
ret void
}

; CHECK-LABEL: @noinstr_dsi_sa
; CHECK-NOT: %0 = load i64, ptr @__msan_param_tls
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
; This test checks that we are not instrumenting sanitizer code.
; RUN: opt < %s -passes='module(sancov-module)' -sanitizer-coverage-level=3 -sanitizer-coverage-control-flow -S | FileCheck %s

target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

; Function with sanitize_address is instrumented.
; Function Attrs: nounwind uwtable
define void @instr_sa(ptr %a) sanitize_address {
entry:
%tmp1 = load i32, ptr %a, align 4
%tmp2 = add i32 %tmp1, 1
store i32 %tmp2, ptr %a, align 4
ret void
}

; CHECK-LABEL: @instr_sa
; CHECK: call void @__sanitizer_cov_trace_pc_guard(


; Function with disable_sanitizer_instrumentation is not instrumented.
; Function Attrs: nounwind uwtable
define void @noinstr_dsi(ptr %a) disable_sanitizer_instrumentation {
entry:
%tmp1 = load i32, ptr %a, align 4
%tmp2 = add i32 %tmp1, 1
store i32 %tmp2, ptr %a, align 4
ret void
}

; CHECK-LABEL: @noinstr_dsi
; CHECK-NOT: call void @__sanitizer_cov_trace_pc_guard(


; disable_sanitizer_instrumentation takes precedence over sanitize_address.
; Function Attrs: nounwind uwtable
define void @noinstr_dsi_sa(ptr %a) disable_sanitizer_instrumentation sanitize_address {
entry:
%tmp1 = load i32, ptr %a, align 4
%tmp2 = add i32 %tmp1, 1
store i32 %tmp2, ptr %a, align 4
ret void
}

; CHECK-LABEL: @noinstr_dsi_sa
; CHECK-NOT: call void @__sanitizer_cov_trace_pc_guard(

0 comments on commit 45726c1

Please sign in to comment.