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