r176550 - [Sanitize] Don't emit function attribute sanitize_address/thread/memory if the function is blacklisted.

Alexey Samsonov samsonov at google.com
Wed Mar 6 02:54:18 PST 2013


Author: samsonov
Date: Wed Mar  6 04:54:18 2013
New Revision: 176550

URL: http://llvm.org/viewvc/llvm-project?rev=176550&view=rev
Log:
[Sanitize] Don't emit function attribute sanitize_address/thread/memory if the function is blacklisted.

Modified:
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp
    cfe/trunk/test/CodeGen/address-safety-attr.cpp

Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=176550&r1=176549&r2=176550&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Wed Mar  6 04:54:18 2013
@@ -619,16 +619,20 @@ void CodeGenModule::SetLLVMFunctionAttri
   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)

Modified: cfe/trunk/test/CodeGen/address-safety-attr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/address-safety-attr.cpp?rev=176550&r1=176549&r2=176550&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/address-safety-attr.cpp (original)
+++ cfe/trunk/test/CodeGen/address-safety-attr.cpp Wed Mar  6 04:54:18 2013
@@ -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
@@ -11,31 +13,42 @@
 // 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 = TemplateAddressSafe
 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{{.*}} }





More information about the cfe-commits mailing list