xref: /minix3/external/bsd/llvm/dist/clang/test/CodeGen/address-safety-attr.cpp (revision 0b98e8aad89f2bd4ba80b523d73cf29e9dd82ce1)
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