]> granicus.if.org Git - clang/commitdiff
[Sanitize] Don't emit function attribute sanitize_address/thread/memory if the functi...
authorAlexey Samsonov <samsonov@google.com>
Wed, 6 Mar 2013 10:54:18 +0000 (10:54 +0000)
committerAlexey Samsonov <samsonov@google.com>
Wed, 6 Mar 2013 10:54:18 +0000 (10:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176550 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenModule.cpp
test/CodeGen/address-safety-attr.cpp

index cae2c867db2346086732441848e42de0f522148d..402b309f8eca7e4ab2ac54b74cf25e92ef6a5ca1 100644 (file)
@@ -619,16 +619,20 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D,
   else if (LangOpts.getStackProtector() == LangOptions::SSPReq)
     F->addFnAttr(llvm::Attribute::StackProtectReq);
 
-  // When AddressSanitizer is enabled, set SanitizeAddress attribute
-  // unless __attribute__((no_sanitize_address)) is used.
-  if (SanOpts.Address && !D->hasAttr<NoSanitizeAddressAttr>())
-    F->addFnAttr(llvm::Attribute::SanitizeAddress);
-  // Same for ThreadSanitizer and __attribute__((no_sanitize_thread))
-  if (SanOpts.Thread && !D->hasAttr<NoSanitizeThreadAttr>())
-    F->addFnAttr(llvm::Attribute::SanitizeThread);
-  // Same for MemorySanitizer and __attribute__((no_sanitize_memory))
-  if (SanOpts.Memory && !D->hasAttr<NoSanitizeMemoryAttr>())
-    F->addFnAttr(llvm::Attribute::SanitizeMemory);
+  // Add sanitizer attributes if function is not blacklisted.
+  if (!SanitizerBlacklist.isIn(*F)) {
+    // When AddressSanitizer is enabled, set SanitizeAddress attribute
+    // unless __attribute__((no_sanitize_address)) is used.
+    if (SanOpts.Address && !D->hasAttr<NoSanitizeAddressAttr>())
+      F->addFnAttr(llvm::Attribute::SanitizeAddress);
+    // Same for ThreadSanitizer and __attribute__((no_sanitize_thread))
+    if (SanOpts.Thread && !D->hasAttr<NoSanitizeThreadAttr>()) {
+      F->addFnAttr(llvm::Attribute::SanitizeThread);
+    }
+    // Same for MemorySanitizer and __attribute__((no_sanitize_memory))
+    if (SanOpts.Memory && !D->hasAttr<NoSanitizeMemoryAttr>())
+      F->addFnAttr(llvm::Attribute::SanitizeMemory);
+  }
 
   unsigned alignment = D->getMaxAlignment() / Context.getCharWidth();
   if (alignment)
index 88f75a1d5088555a8092f0fc84bcc201a2be2045..f94efd62c9c0f38ac9f6f3c67b368b9ba40d767f 100644 (file)
@@ -1,9 +1,11 @@
 // RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s | FileCheck -check-prefix=WITHOUT %s
 // RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s -fsanitize=address | FileCheck -check-prefix=ASAN %s
-// RUN: echo "src:%s" > %t
-// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s -fsanitize=address -fsanitize-blacklist=%t | FileCheck -check-prefix=BL %s
+// RUN: echo "src:%s" > %t.file.blacklist
+// RUN: echo "fun:*BlacklistedFunction*" > %t.func.blacklist
+// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s -fsanitize=address -fsanitize-blacklist=%t.file.blacklist | FileCheck -check-prefix=BLFILE %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s -fsanitize=address -fsanitize-blacklist=%t.func.blacklist | FileCheck -check-prefix=BLFUNC %s
 
-// FIXME: %t is like "src:x:\path\to\clang\test\CodeGen\address-safety-attr.cpp"
+// FIXME: %t.file.blacklist is like "src:x:\path\to\clang\test\CodeGen\address-safety-attr.cpp"
 // REQUIRES: shell
 
 // The sanitize_address attribute should be attached to functions
 // is present.
 
 // WITHOUT:  NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]]
-// BL:  NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]]
+// BLFILE:  NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]]
+// BLFUNC:  NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]]
 // ASAN:  NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]]
 __attribute__((no_sanitize_address))
 int NoAddressSafety1(int *a) { return *a; }
 
 // WITHOUT:  NoAddressSafety2{{.*}}) [[NOATTR]]
-// BL:  NoAddressSafety2{{.*}}) [[NOATTR]]
+// BLFILE:  NoAddressSafety2{{.*}}) [[NOATTR]]
+// BLFUNC:  NoAddressSafety2{{.*}}) [[NOATTR]]
 // ASAN:  NoAddressSafety2{{.*}}) [[NOATTR]]
 __attribute__((no_sanitize_address))
 int NoAddressSafety2(int *a);
 int NoAddressSafety2(int *a) { return *a; }
 
 // WITHOUT:  AddressSafetyOk{{.*}}) [[NOATTR]]
-// BL:  AddressSafetyOk{{.*}}) [[NOATTR]]
+// BLFILE:  AddressSafetyOk{{.*}}) [[NOATTR]]
+// BLFUNC: AddressSafetyOk{{.*}}) [[WITH:#[0-9]+]]
 // ASAN: AddressSafetyOk{{.*}}) [[WITH:#[0-9]+]]
 int AddressSafetyOk(int *a) { return *a; }
 
+// WITHOUT:  BlacklistedFunction{{.*}}) [[NOATTR]]
+// BLFILE:  BlacklistedFunction{{.*}}) [[NOATTR]]
+// BLFUNC:  BlacklistedFunction{{.*}}) [[NOATTR]]
+// ASAN:  BlacklistedFunction{{.*}}) [[WITH]]
+int BlacklistedFunction(int *a) { return *a; }
+
 // WITHOUT:  TemplateAddressSafetyOk{{.*}}) [[NOATTR]]
-// BL:  TemplateAddressSafetyOk{{.*}}) [[NOATTR]]
+// BLFILE:  TemplateAddressSafetyOk{{.*}}) [[NOATTR]]
+// BLFUNC:  TemplateAddressSafetyOk{{.*}}) [[WITH]]
 // ASAN: TemplateAddressSafetyOk{{.*}}) [[WITH]]
 template<int i>
 int TemplateAddressSafetyOk() { return i; }
 
 // WITHOUT:  TemplateNoAddressSafety{{.*}}) [[NOATTR]]
-// BL:  TemplateNoAddressSafety{{.*}}) [[NOATTR]]
+// BLFILE:  TemplateNoAddressSafety{{.*}}) [[NOATTR]]
+// BLFUNC:  TemplateNoAddressSafety{{.*}}) [[NOATTR]]
 // ASAN: TemplateNoAddressSafety{{.*}}) [[NOATTR]]
 template<int i>
 __attribute__((no_sanitize_address))
@@ -48,14 +61,19 @@ int force_instance = TemplateAddressSafetyOk<42>()
 int global1 = 0;
 int global2 = *(int*)((char*)&global1+1);
 // WITHOUT: @__cxx_global_var_init{{.*}}[[NOATTR_NO_TF:#[0-9]+]]
-// BL: @__cxx_global_var_init{{.*}}[[NOATTR_NO_TF:#[0-9]+]]
+// BLFILE: @__cxx_global_var_init{{.*}}[[NOATTR_NO_TF:#[0-9]+]]
+// BLFUNC: @__cxx_global_var_init{{.*}}[[WITH_NO_TF:#[0-9]+]]
 // ASAN: @__cxx_global_var_init{{.*}}[[WITH_NO_TF:#[0-9]+]]
 
 // WITHOUT: attributes [[NOATTR]] = { nounwind{{.*}} }
 // WITHOUT: attributes [[NOATTR_NO_TF]] = { nounwind }
 
-// BL: attributes [[NOATTR]] = { nounwind{{.*}} }
-// BL: attributes [[NOATTR_NO_TF]] = { nounwind }
+// BLFILE: attributes [[NOATTR]] = { nounwind{{.*}} }
+// BLFILE: attributes [[NOATTR_NO_TF]] = { nounwind }
+
+// BLFUNC: attributes [[NOATTR]] = { nounwind{{.*}} }
+// BLFUNC: attributes [[WITH]] = { nounwind sanitize_address{{.*}} }
+// BLFUNC: attributes [[WITH_NO_TF]] = { nounwind sanitize_address }
 
 // ASAN: attributes [[NOATTR]] = { nounwind{{.*}} }
 // ASAN: attributes [[WITH]] = { nounwind sanitize_address{{.*}} }