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