[llvm] r349015 - [asan] Don't check ODR violations for particular types of globals

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 13 01:47:39 PST 2018


Author: vitalybuka
Date: Thu Dec 13 01:47:39 2018
New Revision: 349015

URL: http://llvm.org/viewvc/llvm-project?rev=349015&view=rev
Log:
[asan] Don't check ODR violations for particular types of globals

Summary:
private and internal: should not trigger ODR at all.
unnamed_addr: current ODR checking approach fail and rereport false violation if
a linker merges such globals
linkonce_odr, weak_odr: could cause similar problems and they are already not
instrumented for ELF.

Reviewers: eugenis, kcc

Subscribers: kubamracek, hiraditya, llvm-commits

Differential Revision: https://reviews.llvm.org/D55621

Added:
    llvm/trunk/test/Instrumentation/AddressSanitizer/odr-check-ignore.ll
Modified:
    llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
    llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-touch-odr-global.ll
    llvm/trunk/test/Instrumentation/AddressSanitizer/global_metadata.ll
    llvm/trunk/test/Instrumentation/AddressSanitizer/local_alias.ll
    llvm/trunk/test/Instrumentation/AddressSanitizer/win-string-literal.ll

Modified: llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp?rev=349015&r1=349014&r2=349015&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp Thu Dec 13 01:47:39 2018
@@ -2190,7 +2190,13 @@ bool AddressSanitizerModule::InstrumentG
           GlobalAlias::create(GlobalValue::PrivateLinkage, "", NewGlobal);
     }
 
-    if (UseOdrIndicator) {
+    // ODR check is not useful for the following, but we see false reports
+    // caused by linker optimizations.
+    if (NewGlobal->hasLocalLinkage() || NewGlobal->hasGlobalUnnamedAddr() ||
+        NewGlobal->hasLinkOnceODRLinkage() || NewGlobal->hasWeakODRLinkage()) {
+      ODRIndicator = ConstantExpr::getIntToPtr(ConstantInt::get(IntptrTy, -1),
+                                               IRB.getInt8PtrTy());
+    } else if (UseOdrIndicator) {
       // With local aliases, we need to provide another externally visible
       // symbol __odr_asan_XXX to detect ODR violation.
       auto *ODRIndicatorSym =

Modified: llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-touch-odr-global.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-touch-odr-global.ll?rev=349015&r1=349014&r2=349015&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-touch-odr-global.ll (original)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-touch-odr-global.ll Thu Dec 13 01:47:39 2018
@@ -5,7 +5,9 @@ target datalayout = "e-p:64:64:64-i1:8:8
 target triple = "x86_64-unknown-linux-gnu"
 ; no action should be taken for these globals
 @global_noinst = linkonce_odr constant [2 x i8] [i8 1, i8 2]
+ at global_weak_noinst = weak_odr constant [2 x i8] [i8 1, i8 2]
 @global_inst = private constant [2 x i8] [i8 1, i8 2]
 ; CHECK-NOT: {{asan_gen.*global_noinst}}
+; CHECK-NOT: {{asan_gen.*global_weak_noinst}}
 ; CHECK: {{asan_gen.*global_inst}}
 ; CHECK: @asan.module_ctor

Modified: llvm/trunk/test/Instrumentation/AddressSanitizer/global_metadata.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/global_metadata.ll?rev=349015&r1=349014&r2=349015&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/global_metadata.ll (original)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/global_metadata.ll Thu Dec 13 01:47:39 2018
@@ -22,7 +22,7 @@ target triple = "x86_64-unknown-linux-gn
 ; CHECK: [[FILENAME:@___asan_gen_.[0-9]+]] = private unnamed_addr constant [22 x i8] c"/tmp/asan-globals.cpp\00", align 1
 ; CHECK: [[LOCDESCR:@___asan_gen_.[0-9]+]] = private unnamed_addr constant { [22 x i8]*, i32, i32 } { [22 x i8]* [[FILENAME]], i32 5, i32 5 }
 ; CHECK: @__asan_global_global = {{.*}}i64 ptrtoint ({ i32, [60 x i8] }* @global to i64){{.*}} section "asan_globals"{{.*}}, !associated
-; CHECK: @__asan_global_.str = {{.*}}i64 ptrtoint ({ [14 x i8], [50 x i8] }* @.str to i64){{.*}} section "asan_globals"{{.*}}, !associated
+; CHECK: @__asan_global_.str = {{.*}}i64 ptrtoint ({ [14 x i8], [50 x i8] }* @{{.str|1}} to i64){{.*}} section "asan_globals"{{.*}}, !associated
 
 ; The metadata has to be inserted to llvm.compiler.used to avoid being stripped
 ; during LTO.

Modified: llvm/trunk/test/Instrumentation/AddressSanitizer/local_alias.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/local_alias.ll?rev=349015&r1=349014&r2=349015&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/local_alias.ll (original)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/local_alias.ll Thu Dec 13 01:47:39 2018
@@ -6,14 +6,21 @@
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
 
- at a = internal global [2 x i32] zeroinitializer, align 4
+ at a = dso_local global [2 x i32] zeroinitializer, align 4
+ at b = private global [2 x i32] zeroinitializer, align 4
+ at c = internal global [2 x i32] zeroinitializer, align 4
+ at d = unnamed_addr global [2 x i32] zeroinitializer, align 4
 
 ; Check that we generate internal alias and odr indicator symbols for global to be protected.
 ; CHECK-NOINDICATOR-NOT: __odr_asan_gen_a
 ; CHECK-NOALIAS-NOT: private alias
-; CHECK-INDICATOR: @__odr_asan_gen_a = internal global i8 0, align 1
+; CHECK-INDICATOR: @__odr_asan_gen_a = global i8 0, align 1
 ; CHECK-ALIAS: @0 = private alias { [2 x i32], [56 x i8] }, { [2 x i32], [56 x i8] }* @a
 
+; CHECK-ALIAS: @1 = private alias { [2 x i32], [56 x i8] }, { [2 x i32], [56 x i8] }* @b
+; CHECK-ALIAS: @2 = private alias { [2 x i32], [56 x i8] }, { [2 x i32], [56 x i8] }* @c
+; CHECK-ALIAS: @3 = private alias { [2 x i32], [56 x i8] }, { [2 x i32], [56 x i8] }* @d
+
 ; Function Attrs: nounwind sanitize_address uwtable
 define i32 @foo(i32 %M) #0 {
 entry:

Added: llvm/trunk/test/Instrumentation/AddressSanitizer/odr-check-ignore.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/odr-check-ignore.ll?rev=349015&view=auto
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/odr-check-ignore.ll (added)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/odr-check-ignore.ll Thu Dec 13 01:47:39 2018
@@ -0,0 +1,17 @@
+; 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 a = global [2 x i32] zeroinitializer, align 4
+ at b = private global [2 x i32] zeroinitializer, align 4
+ at c = internal global [2 x i32] zeroinitializer, align 4
+ at d = unnamed_addr global [2 x i32] zeroinitializer, align 4
+
+; CHECK: @__asan_global_a = private global { i64, i64, i64, i64, i64, i64, i64, i64 } { i64 ptrtoint ({ [2 x i32], [56 x i8] }* @a to i64), i64 8, i64 64, i64 ptrtoint ([2 x i8]* @___asan_gen_.1 to i64), i64 ptrtoint ([8 x i8]* @___asan_gen_ to i64), i64 0, i64 0, i64 0 }
+
+; CHECK: @__asan_global_b = private global { i64, i64, i64, i64, i64, i64, i64, i64 } { i64 ptrtoint ({ [2 x i32], [56 x i8] }* @b to i64), i64 8, i64 64, i64 ptrtoint ([2 x i8]* @___asan_gen_.2 to i64), i64 ptrtoint ([8 x i8]* @___asan_gen_ to i64), i64 0, i64 0, i64 -1 }
+
+; CHECK: @__asan_global_c = private global { i64, i64, i64, i64, i64, i64, i64, i64 } { i64 ptrtoint ({ [2 x i32], [56 x i8] }* @c to i64), i64 8, i64 64, i64 ptrtoint ([2 x i8]* @___asan_gen_.3 to i64), i64 ptrtoint ([8 x i8]* @___asan_gen_ to i64), i64 0, i64 0, i64 -1 }
+
+; CHECK: @__asan_global_d = private global { i64, i64, i64, i64, i64, i64, i64, i64 } { i64 ptrtoint ({ [2 x i32], [56 x i8] }* @d to i64), i64 8, i64 64, i64 ptrtoint ([2 x i8]* @___asan_gen_.4 to i64), i64 ptrtoint ([8 x i8]* @___asan_gen_ to i64), i64 0, i64 0, i64 -1 }

Modified: llvm/trunk/test/Instrumentation/AddressSanitizer/win-string-literal.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/win-string-literal.ll?rev=349015&r1=349014&r2=349015&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/win-string-literal.ll (original)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/win-string-literal.ll Thu Dec 13 01:47:39 2018
@@ -15,7 +15,7 @@
 ; CHECK-SAME: { i64 ptrtoint ({ [5 x i8], [59 x i8] }* @"??_C at _04JIHMPGLA@asdf?$AA@" to i64),
 ; CHECK-SAME:   i64 5, i64 64, i64 ptrtoint ([17 x i8]* @___asan_gen_.1 to i64),
 ; CHECK-SAME:   i64 ptrtoint ([8 x i8]* @___asan_gen_ to i64), i64 0,
-; CHECK-SAME:   i64 ptrtoint ({ [6 x i8]*, i32, i32 }* @___asan_gen_.3 to i64), i64 0 },
+; CHECK-SAME:   i64 ptrtoint ({ [6 x i8]*, i32, i32 }* @___asan_gen_.3 to i64), i64 -1 },
 ; CHECK-SAME:   section ".ASAN$GL", comdat($"??_C at _04JIHMPGLA@asdf?$AA@"), align 64
 
 ; ModuleID = 't.cpp'




More information about the llvm-commits mailing list