[llvm] r247734 - [ASan] Don't instrument globals in .preinit_array/.init_array/.fini_array

Alexey Samsonov via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 15 16:05:49 PDT 2015


Author: samsonov
Date: Tue Sep 15 18:05:48 2015
New Revision: 247734

URL: http://llvm.org/viewvc/llvm-project?rev=247734&view=rev
Log:
[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.

Added:
    llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll
      - copied, changed from r247719, llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata-darwin.ll
    llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-linux.ll
Removed:
    llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-cstring.ll
    llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata-darwin.ll
    llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata.ll
Modified:
    llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp

Modified: llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp?rev=247734&r1=247733&r2=247734&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp Tue Sep 15 18:05:48 2015
@@ -1187,6 +1187,14 @@ bool AddressSanitizerModule::ShouldInstr
     // 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

Removed: llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-cstring.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-cstring.ll?rev=247733&view=auto
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-cstring.ll (original)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-cstring.ll (removed)
@@ -1,8 +0,0 @@
-; RUN: opt < %s -asan -asan-module -S | FileCheck %s
-
-target datalayout = "e"
-target triple = "x86_64-apple-darwin10.0.0"
-
- at 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

Copied: llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll (from r247719, llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata-darwin.ll)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll?p2=llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll&p1=llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata-darwin.ll&r1=247719&r2=247734&rev=247734&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata-darwin.ll (original)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-darwin.ll Tue Sep 15 18:05:48 2015
@@ -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"
 
+ at 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"

Added: llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-linux.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-linux.ll?rev=247734&view=auto
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-linux.ll (added)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-globals-linux.ll Tue Sep 15 18:05:48 2015
@@ -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
+}
+
+ at __call_foo = global void ()* @_ZL3foov, section ".preinit_array", align 8
+ at __call_foo_2 = global void ()* @_ZL3foov, section ".init_array", align 8
+ at __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
+}
+
+ at .str_noinst = private unnamed_addr constant [4 x i8] c"aaa\00", section "llvm.metadata"
+ at .str_noinst_prof = private unnamed_addr constant [4 x i8] c"aaa\00", section "__llvm_prf_data"
+ at .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

Removed: llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata-darwin.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata-darwin.ll?rev=247733&view=auto
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata-darwin.ll (original)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata-darwin.ll (removed)
@@ -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-apple-macosx10.10.0"
-
- at .str_noinst = private unnamed_addr constant [4 x i8] c"aaa\00", section "llvm.metadata"
- at .str_noinst_prof = private unnamed_addr constant [4 x i8] c"aaa\00", section "__DATA,__llvm_covmap"
- at .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

Removed: llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata.ll?rev=247733&view=auto
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata.ll (original)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-llvm-metadata.ll (removed)
@@ -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"
-
- at .str_noinst = private unnamed_addr constant [4 x i8] c"aaa\00", section "llvm.metadata"
- at .str_noinst_prof = private unnamed_addr constant [4 x i8] c"aaa\00", section "__llvm_prf_data"
- at .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




More information about the llvm-commits mailing list