1 | // RUN: %clang_cc1 -triple x86_64-gnu-linux -emit-llvm -o - %s | FileCheck %s -check-prefix=PLAIN |
2 | // RUN: %clang_cc1 -triple x86_64-gnu-linux -emit-llvm -o - -fsanitize=address %s | FileCheck %s -check-prefix=ASAN |
3 | // RUN: %clang_cc1 -triple x86_64-gnu-linux -emit-llvm -o - -fsanitize=address -fsanitize-address-poison-custom-array-cookie %s | FileCheck %s -check-prefix=ASAN-POISON-ALL-NEW-ARRAY |
4 | |
5 | typedef __typeof__(sizeof(0)) size_t; |
6 | namespace std { |
7 | struct nothrow_t {}; |
8 | std::nothrow_t nothrow; |
9 | } |
10 | void *operator new[](size_t, const std::nothrow_t &) throw(); |
11 | void *operator new[](size_t, char *); |
12 | void *operator new[](size_t, int, int); |
13 | |
14 | struct C { |
15 | int x; |
16 | ~C(); |
17 | }; |
18 | |
19 | C *CallNew() { |
20 | return new C[10]; |
21 | } |
22 | // PLAIN-LABEL: CallNew |
23 | // PLAIN-NOT: nosanitize |
24 | // PLAIN-NOT: __asan_poison_cxx_array_cookie |
25 | // ASAN-LABEL: CallNew |
26 | // ASAN: store{{.*}}nosanitize |
27 | // ASAN-NOT: nosanitize |
28 | // ASAN: call void @__asan_poison_cxx_array_cookie |
29 | |
30 | C *CallNewNoThrow() { |
31 | return new (std::nothrow) C[10]; |
32 | } |
33 | // PLAIN-LABEL: CallNewNoThrow |
34 | // PLAIN-NOT: nosanitize |
35 | // PLAIN-NOT: __asan_poison_cxx_array_cookie |
36 | // ASAN-LABEL: CallNewNoThrow |
37 | // ASAN: store{{.*}}nosanitize |
38 | // ASAN-NOT: nosanitize |
39 | // ASAN: call void @__asan_poison_cxx_array_cookie |
40 | |
41 | void CallDelete(C *c) { |
42 | delete [] c; |
43 | } |
44 | |
45 | // PLAIN-LABEL: CallDelete |
46 | // PLAIN-NOT: nosanitize |
47 | // ASAN-LABEL: CallDelete |
48 | // ASAN-NOT: nosanitize |
49 | // ASAN: call i64 @__asan_load_cxx_array_cookie |
50 | // ASAN-NOT: nosanitize |
51 | |
52 | char Buffer[20]; |
53 | C *CallPlacementNew() { |
54 | return new (Buffer) C[20]; |
55 | } |
56 | // ASAN-LABEL: CallPlacementNew |
57 | // ASAN-NOT: __asan_poison_cxx_array_cookie |
58 | |
59 | C *CallNewWithArgs() { |
60 | // ASAN-LABEL: CallNewWithArgs |
61 | // ASAN-NOT: call void @__asan_poison_cxx_array_cookie |
62 | // ASAN-POISON-ALL-NEW-ARRAY: call void @__asan_poison_cxx_array_cookie |
63 | return new (123, 456) C[20]; |
64 | } |
65 | |