xref: /aosp_15_r20/external/clang/test/CodeGen/address-safety-attr.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li int 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 Li int 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 Li int 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 Li int 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 Li int 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 Li int 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 Li int 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 Li int 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 Li GENERATE_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 Li int 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 Li int 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 Li int 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