12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- // RUN: %clang_cc1 -triple x86_64-gnu-linux -emit-llvm -o - %s | FileCheck %s -check-prefix=PLAIN
- // RUN: %clang_cc1 -triple x86_64-gnu-linux -emit-llvm -o - -fsanitize=address %s | FileCheck %s -check-prefix=ASAN
- // 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
- typedef __typeof__(sizeof(0)) size_t;
- namespace std {
- struct nothrow_t {};
- std::nothrow_t nothrow;
- }
- void *operator new[](size_t, const std::nothrow_t &) throw();
- void *operator new[](size_t, char *);
- void *operator new[](size_t, int, int);
- struct C {
- int x;
- ~C();
- };
- C *CallNew() {
- return new C[10];
- }
- // PLAIN-LABEL: CallNew
- // PLAIN-NOT: nosanitize
- // PLAIN-NOT: __asan_poison_cxx_array_cookie
- // ASAN-LABEL: CallNew
- // ASAN: store{{.*}}nosanitize
- // ASAN-NOT: nosanitize
- // ASAN: call void @__asan_poison_cxx_array_cookie
- C *CallNewNoThrow() {
- return new (std::nothrow) C[10];
- }
- // PLAIN-LABEL: CallNewNoThrow
- // PLAIN-NOT: nosanitize
- // PLAIN-NOT: __asan_poison_cxx_array_cookie
- // ASAN-LABEL: CallNewNoThrow
- // ASAN: store{{.*}}nosanitize
- // ASAN-NOT: nosanitize
- // ASAN: call void @__asan_poison_cxx_array_cookie
- void CallDelete(C *c) {
- delete [] c;
- }
- // PLAIN-LABEL: CallDelete
- // PLAIN-NOT: nosanitize
- // ASAN-LABEL: CallDelete
- // ASAN-NOT: nosanitize
- // ASAN: call i64 @__asan_load_cxx_array_cookie
- // ASAN-NOT: nosanitize
- char Buffer[20];
- C *CallPlacementNew() {
- return new (Buffer) C[20];
- }
- // ASAN-LABEL: CallPlacementNew
- // ASAN-NOT: __asan_poison_cxx_array_cookie
- C *CallNewWithArgs() {
- // ASAN-LABEL: CallNewWithArgs
- // ASAN-NOT: call void @__asan_poison_cxx_array_cookie
- // ASAN-POISON-ALL-NEW-ARRAY: call void @__asan_poison_cxx_array_cookie
- return new (123, 456) C[20];
- }
|