1*67e74705SXin Li int DefinedInDifferentFile(int *a); 2*67e74705SXin Li // RUN: echo "int DefinedInDifferentFile(int *a) { return *a; }" > %t.extra-source.cpp 3*67e74705SXin Li // RUN: echo "struct S { S(){} ~S(){} };" >> %t.extra-source.cpp 4*67e74705SXin Li // RUN: echo "S glob_array[5];" >> %t.extra-source.cpp 5*67e74705SXin Li 6*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin -emit-llvm -o - %s -include %t.extra-source.cpp | FileCheck -check-prefix=WITHOUT %s 7*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin -emit-llvm -o - %s -include %t.extra-source.cpp -fsanitize=address | FileCheck -check-prefix=ASAN %s 8*67e74705SXin Li 9*67e74705SXin Li // RUN: echo "fun:*BlacklistedFunction*" > %t.func.blacklist 10*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin -emit-llvm -o - %s -include %t.extra-source.cpp -fsanitize=address -fsanitize-blacklist=%t.func.blacklist | FileCheck -check-prefix=BLFUNC %s 11*67e74705SXin Li 12*67e74705SXin Li // RUN: echo "src:%s" > %t.file.blacklist 13*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin -emit-llvm -o - %s -include %t.extra-source.cpp -fsanitize=address -fsanitize-blacklist=%t.file.blacklist | FileCheck -check-prefix=BLFILE %s 14*67e74705SXin Li 15*67e74705SXin Li // FIXME: %t.file.blacklist is like "src:x:\path\to\clang\test\CodeGen\address-safety-attr.cpp" 16*67e74705SXin Li // REQUIRES: shell 17*67e74705SXin Li 18*67e74705SXin Li // The sanitize_address attribute should be attached to functions 19*67e74705SXin Li // when AddressSanitizer is enabled, unless no_sanitize_address attribute 20*67e74705SXin Li // is present. 21*67e74705SXin Li 22*67e74705SXin Li // Attributes for function defined in different source file: 23*67e74705SXin Li // WITHOUT: DefinedInDifferentFile{{.*}} [[NOATTR:#[0-9]+]] 24*67e74705SXin Li // BLFILE: DefinedInDifferentFile{{.*}} [[WITH:#[0-9]+]] 25*67e74705SXin Li // BLFUNC: DefinedInDifferentFile{{.*}} [[WITH:#[0-9]+]] 26*67e74705SXin Li // ASAN: DefinedInDifferentFile{{.*}} [[WITH:#[0-9]+]] 27*67e74705SXin Li 28*67e74705SXin Li // Check that functions generated for global in different source file are 29*67e74705SXin Li // not blacklisted. 30*67e74705SXin Li // WITHOUT: @__cxx_global_var_init{{.*}}[[NOATTR:#[0-9]+]] 31*67e74705SXin Li // WITHOUT: @__cxx_global_array_dtor{{.*}}[[NOATTR]] 32*67e74705SXin Li // BLFILE: @__cxx_global_var_init{{.*}}[[WITH:#[0-9]+]] 33*67e74705SXin Li // BLFILE: @__cxx_global_array_dtor{{.*}}[[WITH]] 34*67e74705SXin Li // BLFUNC: @__cxx_global_var_init{{.*}}[[WITH:#[0-9]+]] 35*67e74705SXin Li // BLFUNC: @__cxx_global_array_dtor{{.*}}[[WITH]] 36*67e74705SXin Li // ASAN: @__cxx_global_var_init{{.*}}[[WITH:#[0-9]+]] 37*67e74705SXin Li // ASAN: @__cxx_global_array_dtor{{.*}}[[WITH]] 38*67e74705SXin Li 39*67e74705SXin Li 40*67e74705SXin Li // WITHOUT: NoAddressSafety1{{.*}}) [[NOATTR]] 41*67e74705SXin Li // BLFILE: NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]] 42*67e74705SXin Li // BLFUNC: NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]] 43*67e74705SXin Li // ASAN: NoAddressSafety1{{.*}}) [[NOATTR:#[0-9]+]] 44*67e74705SXin Li __attribute__((no_sanitize_address)) NoAddressSafety1(int * a)45*67e74705SXin Liint NoAddressSafety1(int *a) { return *a; } 46*67e74705SXin Li 47*67e74705SXin Li // WITHOUT: NoAddressSafety2{{.*}}) [[NOATTR]] 48*67e74705SXin Li // BLFILE: NoAddressSafety2{{.*}}) [[NOATTR]] 49*67e74705SXin Li // BLFUNC: NoAddressSafety2{{.*}}) [[NOATTR]] 50*67e74705SXin Li // ASAN: NoAddressSafety2{{.*}}) [[NOATTR]] 51*67e74705SXin Li __attribute__((no_sanitize_address)) 52*67e74705SXin Li int NoAddressSafety2(int *a); NoAddressSafety2(int * a)53*67e74705SXin Liint NoAddressSafety2(int *a) { return *a; } 54*67e74705SXin Li 55*67e74705SXin Li // WITHOUT: NoAddressSafety3{{.*}}) [[NOATTR]] 56*67e74705SXin Li // BLFILE: NoAddressSafety3{{.*}}) [[NOATTR]] 57*67e74705SXin Li // BLFUNC: NoAddressSafety3{{.*}}) [[NOATTR]] 58*67e74705SXin Li // ASAN: NoAddressSafety3{{.*}}) [[NOATTR]] 59*67e74705SXin Li [[gnu::no_sanitize_address]] NoAddressSafety3(int * a)60*67e74705SXin Liint NoAddressSafety3(int *a) { return *a; } 61*67e74705SXin Li 62*67e74705SXin Li // WITHOUT: NoAddressSafety4{{.*}}) [[NOATTR]] 63*67e74705SXin Li // BLFILE: NoAddressSafety4{{.*}}) [[NOATTR]] 64*67e74705SXin Li // BLFUNC: NoAddressSafety4{{.*}}) [[NOATTR]] 65*67e74705SXin Li // ASAN: NoAddressSafety4{{.*}}) [[NOATTR]] 66*67e74705SXin Li [[gnu::no_sanitize_address]] 67*67e74705SXin Li int NoAddressSafety4(int *a); NoAddressSafety4(int * a)68*67e74705SXin Liint NoAddressSafety4(int *a) { return *a; } 69*67e74705SXin Li 70*67e74705SXin Li // WITHOUT: NoAddressSafety5{{.*}}) [[NOATTR]] 71*67e74705SXin Li // BLFILE: NoAddressSafety5{{.*}}) [[NOATTR]] 72*67e74705SXin Li // BLFUNC: NoAddressSafety5{{.*}}) [[NOATTR]] 73*67e74705SXin Li // ASAN: NoAddressSafety5{{.*}}) [[NOATTR]] 74*67e74705SXin Li __attribute__((no_sanitize("address"))) NoAddressSafety5(int * a)75*67e74705SXin Liint NoAddressSafety5(int *a) { return *a; } 76*67e74705SXin Li 77*67e74705SXin Li // WITHOUT: NoAddressSafety6{{.*}}) [[NOATTR]] 78*67e74705SXin Li // BLFILE: NoAddressSafety6{{.*}}) [[NOATTR]] 79*67e74705SXin Li // BLFUNC: NoAddressSafety6{{.*}}) [[NOATTR]] 80*67e74705SXin Li // ASAN: NoAddressSafety6{{.*}}) [[NOATTR]] 81*67e74705SXin Li __attribute__((no_sanitize("address"))) 82*67e74705SXin Li int NoAddressSafety6(int *a); NoAddressSafety6(int * a)83*67e74705SXin Liint NoAddressSafety6(int *a) { return *a; } 84*67e74705SXin Li 85*67e74705SXin Li // WITHOUT: AddressSafetyOk{{.*}}) [[NOATTR]] 86*67e74705SXin Li // BLFILE: AddressSafetyOk{{.*}}) [[NOATTR]] 87*67e74705SXin Li // BLFUNC: AddressSafetyOk{{.*}}) [[WITH]] 88*67e74705SXin Li // ASAN: AddressSafetyOk{{.*}}) [[WITH]] AddressSafetyOk(int * a)89*67e74705SXin Liint AddressSafetyOk(int *a) { return *a; } 90*67e74705SXin Li 91*67e74705SXin Li // WITHOUT: BlacklistedFunction{{.*}}) [[NOATTR]] 92*67e74705SXin Li // BLFILE: BlacklistedFunction{{.*}}) [[NOATTR]] 93*67e74705SXin Li // BLFUNC: BlacklistedFunction{{.*}}) [[NOATTR]] 94*67e74705SXin Li // ASAN: BlacklistedFunction{{.*}}) [[WITH]] BlacklistedFunction(int * a)95*67e74705SXin Liint BlacklistedFunction(int *a) { return *a; } 96*67e74705SXin Li 97*67e74705SXin Li #define GENERATE_FUNC(name) \ 98*67e74705SXin Li int name(int *a) { return *a; } 99*67e74705SXin Li // WITHOUT: GeneratedFunction{{.*}}) [[NOATTR]] 100*67e74705SXin Li // BLFILE: GeneratedFunction{{.*}}) [[NOATTR]] 101*67e74705SXin Li // BLFUNC: GeneratedFunction{{.*}}) [[WITH]] 102*67e74705SXin Li // ASAN: GeneratedFunction{{.*}}) [[WITH]] GENERATE_FUNC(GeneratedFunction)103*67e74705SXin LiGENERATE_FUNC(GeneratedFunction) 104*67e74705SXin Li 105*67e74705SXin Li #define GENERATE_NAME(name) name##_generated 106*67e74705SXin Li // WITHOUT: Function_generated{{.*}}) [[NOATTR]] 107*67e74705SXin Li // BLFILE: Function_generated{{.*}}) [[NOATTR]] 108*67e74705SXin Li // BLFUNC: Function_generated{{.*}}) [[WITH]] 109*67e74705SXin Li // ASAN: Function_generated{{.*}}) [[WITH]] 110*67e74705SXin Li int GENERATE_NAME(Function)(int *a) { return *a; } 111*67e74705SXin Li 112*67e74705SXin Li // WITHOUT: TemplateAddressSafetyOk{{.*}}) [[NOATTR]] 113*67e74705SXin Li // BLFILE: TemplateAddressSafetyOk{{.*}}) [[NOATTR]] 114*67e74705SXin Li // BLFUNC: TemplateAddressSafetyOk{{.*}}) [[WITH]] 115*67e74705SXin Li // ASAN: TemplateAddressSafetyOk{{.*}}) [[WITH]] 116*67e74705SXin Li template<int i> TemplateAddressSafetyOk()117*67e74705SXin Liint TemplateAddressSafetyOk() { return i; } 118*67e74705SXin Li 119*67e74705SXin Li // WITHOUT: TemplateNoAddressSafety1{{.*}}) [[NOATTR]] 120*67e74705SXin Li // BLFILE: TemplateNoAddressSafety1{{.*}}) [[NOATTR]] 121*67e74705SXin Li // BLFUNC: TemplateNoAddressSafety1{{.*}}) [[NOATTR]] 122*67e74705SXin Li // ASAN: TemplateNoAddressSafety1{{.*}}) [[NOATTR]] 123*67e74705SXin Li template<int i> 124*67e74705SXin Li __attribute__((no_sanitize_address)) TemplateNoAddressSafety1()125*67e74705SXin Liint TemplateNoAddressSafety1() { return i; } 126*67e74705SXin Li 127*67e74705SXin Li // WITHOUT: TemplateNoAddressSafety2{{.*}}) [[NOATTR]] 128*67e74705SXin Li // BLFILE: TemplateNoAddressSafety2{{.*}}) [[NOATTR]] 129*67e74705SXin Li // BLFUNC: TemplateNoAddressSafety2{{.*}}) [[NOATTR]] 130*67e74705SXin Li // ASAN: TemplateNoAddressSafety2{{.*}}) [[NOATTR]] 131*67e74705SXin Li template<int i> 132*67e74705SXin Li __attribute__((no_sanitize("address"))) TemplateNoAddressSafety2()133*67e74705SXin Liint TemplateNoAddressSafety2() { return i; } 134*67e74705SXin Li 135*67e74705SXin Li int force_instance = TemplateAddressSafetyOk<42>() 136*67e74705SXin Li + TemplateNoAddressSafety1<42>() 137*67e74705SXin Li + TemplateNoAddressSafety2<42>(); 138*67e74705SXin Li 139*67e74705SXin Li // Check that __cxx_global_var_init* get the sanitize_address attribute. 140*67e74705SXin Li int global1 = 0; 141*67e74705SXin Li int global2 = *(int*)((char*)&global1+1); 142*67e74705SXin Li // WITHOUT: @__cxx_global_var_init{{.*}}[[NOATTR]] 143*67e74705SXin Li // BLFILE: @__cxx_global_var_init{{.*}}[[NOATTR:#[0-9]+]] 144*67e74705SXin Li // BLFUNC: @__cxx_global_var_init{{.*}}[[WITH]] 145*67e74705SXin Li // ASAN: @__cxx_global_var_init{{.*}}[[WITH]] 146*67e74705SXin Li 147*67e74705SXin Li // WITHOUT: attributes [[NOATTR]] = { nounwind{{.*}} } 148*67e74705SXin Li 149*67e74705SXin Li // BLFILE: attributes [[WITH]] = { nounwind sanitize_address{{.*}} } 150*67e74705SXin Li // BLFILE: attributes [[NOATTR]] = { nounwind{{.*}} } 151*67e74705SXin Li 152*67e74705SXin Li // BLFUNC: attributes [[WITH]] = { nounwind sanitize_address{{.*}} } 153*67e74705SXin Li // BLFUNC: attributes [[NOATTR]] = { nounwind{{.*}} } 154*67e74705SXin Li 155*67e74705SXin Li // ASAN: attributes [[WITH]] = { nounwind sanitize_address{{.*}} } 156*67e74705SXin Li // ASAN: attributes [[NOATTR]] = { nounwind{{.*}} } 157