зеркало из https://github.com/microsoft/clang-1.git
[Sanitize] Don't emit function attribute sanitize_address/thread/memory if the function is blacklisted.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176550 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
360355db57
Коммит
7e73f94c10
|
@ -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)
|
||||
|
|
|
@ -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 = 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{{.*}} }
|
||||
|
|
Загрузка…
Ссылка в новой задаче