From da2c6c300aff5f309e8a50f329ddae79704dec4f Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Tue, 15 Sep 2015 23:05:48 +0000 Subject: [PATCH] [ASan] Don't instrument globals in .preinit_array/.init_array/.fini_array These sections contain pointers to function that should be invoked during startup/shutdown by __libc_csu_init and __libc_csu_fini. Instrumenting these globals will append redzone to them, which will be filled with zeroes. This will cause null pointer dereference at runtime. Merge ASan regression tests for globals that should be ignored by instrumentation pass. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247734 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Instrumentation/AddressSanitizer.cpp | 8 +++++ .../do-not-instrument-cstring.ll | 8 ----- ...ll => do-not-instrument-globals-darwin.ll} | 8 +++-- .../do-not-instrument-globals-linux.ll | 35 +++++++++++++++++++ .../do-not-instrument-llvm-metadata.ll | 15 -------- 5 files changed, 49 insertions(+), 25 deletions(-) delete mode 100644 test/Instrumentation/AddressSanitizer/do-not-instrument-cstring.ll rename test/Instrumentation/AddressSanitizer/{do-not-instrument-llvm-metadata-darwin.ll => do-not-instrument-globals-darwin.ll} (60%) create mode 100644 test/Instrumentation/AddressSanitizer/do-not-instrument-globals-linux.ll delete mode 100644 test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata.ll diff --git a/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/lib/Transforms/Instrumentation/AddressSanitizer.cpp index ce29ff9ecfb..54c95d438f3 100644 --- a/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -1187,6 +1187,14 @@ bool AddressSanitizerModule::ShouldInstrumentGlobal(GlobalVariable *G) { // Do not instrument globals from special LLVM sections. if (Section.find("__llvm") != StringRef::npos) return false; + // Do not instrument function pointers to initialization and termination + // routines: dynamic linker will not properly handle redzones. + if (Section.startswith(".preinit_array") || + Section.startswith(".init_array") || + Section.startswith(".fini_array")) { + return false; + } + // Callbacks put into the CRT initializer/terminator sections // should not be instrumented. // See https://code.google.com/p/address-sanitizer/issues/detail?id=305 diff --git a/test/Instrumentation/AddressSanitizer/do-not-instrument-cstring.ll b/test/Instrumentation/AddressSanitizer/do-not-instrument-cstring.ll deleted file mode 100644 index f096ac1828f..00000000000 --- a/test/Instrumentation/AddressSanitizer/do-not-instrument-cstring.ll +++ /dev/null @@ -1,8 +0,0 @@ -; RUN: opt < %s -asan -asan-module -S | FileCheck %s - -target datalayout = "e" -target triple = "x86_64-apple-darwin10.0.0" - -@foo = private global [19 x i8] c"scannerWithString:\00", section "__TEXT,__objc_methname,cstring_literals" - -; CHECK: @foo = private global [19 x i8] c"scannerWithString:\00", section "__TEXT,__objc_methname,cstring_literals" \ No newline at end of file diff --git a/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata-darwin.ll b/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll similarity index 60% rename from test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata-darwin.ll rename to test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll index f67155a29c2..854f5cb851e 100644 --- a/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata-darwin.ll +++ b/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll @@ -1,10 +1,14 @@ -; This test checks that we are not instrumenting globals in llvm.metadata -; and other llvm internal globals. +; This test checks that we are not instrumenting unnecessary globals +; (llvm.metadata and other llvm internal globals). ; RUN: opt < %s -asan -asan-module -S | FileCheck %s target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.10.0" +@foo_noinst = private global [19 x i8] c"scannerWithString:\00", section "__TEXT,__objc_methname,cstring_literals" + +; CHECK: @foo_noinst = private global [19 x i8] c"scannerWithString:\00", section "__TEXT,__objc_methname,cstring_literals" + @.str_noinst = private unnamed_addr constant [4 x i8] c"aaa\00", section "llvm.metadata" @.str_noinst_prof = private unnamed_addr constant [4 x i8] c"aaa\00", section "__DATA,__llvm_covmap" @.str_inst = private unnamed_addr constant [4 x i8] c"aaa\00" diff --git a/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-linux.ll b/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-linux.ll new file mode 100644 index 00000000000..fc0e676ec13 --- /dev/null +++ b/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-linux.ll @@ -0,0 +1,35 @@ +; This test checks that we are not instrumenting unnecessary globals +; (llvm.metadata, init_array sections, and other llvm internal globals). +; RUN: opt < %s -asan -asan-module -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 Attrs: nounwind uwtable +define internal void @_ZL3foov() #0 { +entry: + ret void +} + +@__call_foo = global void ()* @_ZL3foov, section ".preinit_array", align 8 +@__call_foo_2 = global void ()* @_ZL3foov, section ".init_array", align 8 +@__call_foo_3 = global void ()* @_ZL3foov, section ".fini_array", align 8 + +; CHECK-NOT: asan_gen{{.*}}__call_foo + +; Function Attrs: nounwind uwtable +define i32 @main() #0 { +entry: + %retval = alloca i32, align 4 + store i32 0, i32* %retval, align 4 + ret i32 0 +} + +@.str_noinst = private unnamed_addr constant [4 x i8] c"aaa\00", section "llvm.metadata" +@.str_noinst_prof = private unnamed_addr constant [4 x i8] c"aaa\00", section "__llvm_prf_data" +@.str_inst = private unnamed_addr constant [4 x i8] c"aaa\00" + +; CHECK-NOT: {{asan_gen.*str_noinst}} +; CHECK-NOT: {{asan_gen.*str_noinst_prof}} +; CHECK: {{asan_gen.*str_inst}} +; CHECK: @asan.module_ctor diff --git a/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata.ll b/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata.ll deleted file mode 100644 index 93eca5bfd82..00000000000 --- a/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata.ll +++ /dev/null @@ -1,15 +0,0 @@ -; This test checks that we are not instrumenting globals in llvm.metadata -; and other llvm internal globals. -; RUN: opt < %s -asan -asan-module -S | FileCheck %s - -target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-unknown-linux-gnu" - -@.str_noinst = private unnamed_addr constant [4 x i8] c"aaa\00", section "llvm.metadata" -@.str_noinst_prof = private unnamed_addr constant [4 x i8] c"aaa\00", section "__llvm_prf_data" -@.str_inst = private unnamed_addr constant [4 x i8] c"aaa\00" - -; CHECK-NOT: {{asan_gen.*str_noinst}} -; CHECK-NOT: {{asan_gen.*str_noinst_prof}} -; CHECK: {{asan_gen.*str_inst}} -; CHECK: @asan.module_ctor -- 2.34.1