1 // RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s | FileCheck -check-prefix=WITHOUT %s 2 // RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s -fsanitize=address | FileCheck -check-prefix=ASAN %s 3 // RUN: echo "src:%s" > %t.file.blacklist 4 // RUN: echo "fun:*BlacklistedFunction*" > %t.func.blacklist 5 // RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s -fsanitize=address -fsanitize-blacklist=%t.file.blacklist | FileCheck -check-prefix=BLFILE %s 6 // RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s -fsanitize=address -fsanitize-blacklist=%t.func.blacklist | FileCheck -check-prefix=BLFUNC %s 7 8 // FIXME: %t.file.blacklist is like "src:x:\path\to\clang\test\CodeGen\address-safety-attr.cpp" 9 // REQUIRES: shell 10 11 // The sanitize_address attribute should be attached to functions 12 // when AddressSanitizer is enabled, unless no_sanitize_address attribute 13 // is present. 14 15 // WITHOUT: NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]] 16 // BLFILE: NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]] 17 // BLFUNC: NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]] 18 // ASAN: NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]] 19 __attribute__((no_sanitize_address)) 20 int NoAddressSafety1(int *a) { return *a; } 21 22 // WITHOUT: NoAddressSafety2{{.*}}) [[NOATTR]] 23 // BLFILE: NoAddressSafety2{{.*}}) [[NOATTR]] 24 // BLFUNC: NoAddressSafety2{{.*}}) [[NOATTR]] 25 // ASAN: NoAddressSafety2{{.*}}) [[NOATTR]] 26 __attribute__((no_sanitize_address)) 27 int NoAddressSafety2(int *a); 28 int NoAddressSafety2(int *a) { return *a; } 29 30 // WITHOUT: AddressSafetyOk{{.*}}) [[NOATTR]] 31 // BLFILE: AddressSafetyOk{{.*}}) [[NOATTR]] 32 // BLFUNC: AddressSafetyOk{{.*}}) [[WITH:#[0-9]+]] 33 // ASAN: AddressSafetyOk{{.*}}) [[WITH:#[0-9]+]] 34 int AddressSafetyOk(int *a) { return *a; } 35 36 // WITHOUT: BlacklistedFunction{{.*}}) [[NOATTR]] 37 // BLFILE: BlacklistedFunction{{.*}}) [[NOATTR]] 38 // BLFUNC: BlacklistedFunction{{.*}}) [[NOATTR]] 39 // ASAN: BlacklistedFunction{{.*}}) [[WITH]] 40 int BlacklistedFunction(int *a) { return *a; } 41 42 // WITHOUT: TemplateAddressSafetyOk{{.*}}) [[NOATTR]] 43 // BLFILE: TemplateAddressSafetyOk{{.*}}) [[NOATTR]] 44 // BLFUNC: TemplateAddressSafetyOk{{.*}}) [[WITH]] 45 // ASAN: TemplateAddressSafetyOk{{.*}}) [[WITH]] 46 template<int i> 47 int TemplateAddressSafetyOk() { return i; } 48 49 // WITHOUT: TemplateNoAddressSafety{{.*}}) [[NOATTR]] 50 // BLFILE: TemplateNoAddressSafety{{.*}}) [[NOATTR]] 51 // BLFUNC: TemplateNoAddressSafety{{.*}}) [[NOATTR]] 52 // ASAN: TemplateNoAddressSafety{{.*}}) [[NOATTR]] 53 template<int i> 54 __attribute__((no_sanitize_address)) 55 int TemplateNoAddressSafety() { return i; } 56 57 int force_instance = TemplateAddressSafetyOk<42>() 58 + TemplateNoAddressSafety<42>(); 59 60 // Check that __cxx_global_var_init* get the sanitize_address attribute. 61 int global1 = 0; 62 int global2 = *(int*)((char*)&global1+1); 63 // WITHOUT: @__cxx_global_var_init{{.*}}[[NOATTR_NO_TF:#[0-9]+]] 64 // BLFILE: @__cxx_global_var_init{{.*}}[[NOATTR_NO_TF:#[0-9]+]] 65 // BLFUNC: @__cxx_global_var_init{{.*}}[[WITH_NO_TF:#[0-9]+]] 66 // ASAN: @__cxx_global_var_init{{.*}}[[WITH_NO_TF:#[0-9]+]] 67 68 // WITHOUT: attributes [[NOATTR]] = { nounwind{{.*}} } 69 // WITHOUT: attributes [[NOATTR_NO_TF]] = { nounwind } 70 71 // BLFILE: attributes [[NOATTR]] = { nounwind{{.*}} } 72 // BLFILE: attributes [[NOATTR_NO_TF]] = { nounwind } 73 74 // BLFUNC: attributes [[NOATTR]] = { nounwind{{.*}} } 75 // BLFUNC: attributes [[WITH]] = { nounwind sanitize_address{{.*}} } 76 // BLFUNC: attributes [[WITH_NO_TF]] = { nounwind sanitize_address } 77 78 // ASAN: attributes [[NOATTR]] = { nounwind{{.*}} } 79 // ASAN: attributes [[WITH]] = { nounwind sanitize_address{{.*}} } 80 // ASAN: attributes [[WITH_NO_TF]] = { nounwind sanitize_address } 81