diff options
author | Naomi Musgrave <nmusgrave@google.com> | 2015-08-13 18:35:11 +0000 |
---|---|---|
committer | Naomi Musgrave <nmusgrave@google.com> | 2015-08-13 18:35:11 +0000 |
commit | c17d2d250a685d42dd4531a596d9f78fc4c436fd (patch) | |
tree | fd7eca45710b01c5907cda8448b0e17a22f3e521 /test/CodeGenCXX/sanitize-dtor-callback.cpp | |
parent | 484b48d1d1e83959230f8ef088980a129c57edeb (diff) |
Fix previous commit: poison only class members, simpler tests
Summary: Poisoning applied to only class members, and before dtors for base class invoked
Implement poisoning of only class members in dtor, as opposed to also
poisoning fields inherited from base classes. Members are poisoned
only once, by the last dtor for a class. Skip poisoning if class has
no fields.
Verify emitted code for derived class with virtual destructor sanitizes
its members only once.
Removed patch file containing extraneous changes.
Reviewers: eugenis, kcc
Differential Revision: http://reviews.llvm.org/D11951
Simplified test cases for use-after-dtor
Summary: Simplified test cases to focus on one feature at time.
Tests updated to align with new emission order for sanitizing
callback.
Reviewers: eugenis, kcc
Differential Revision: http://reviews.llvm.org/D12003
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@244933 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX/sanitize-dtor-callback.cpp')
-rw-r--r-- | test/CodeGenCXX/sanitize-dtor-callback.cpp | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/test/CodeGenCXX/sanitize-dtor-callback.cpp b/test/CodeGenCXX/sanitize-dtor-callback.cpp index a3ecbcbdd8..59d498ac3d 100644 --- a/test/CodeGenCXX/sanitize-dtor-callback.cpp +++ b/test/CodeGenCXX/sanitize-dtor-callback.cpp @@ -1,24 +1,26 @@ // Test -fsanitize-memory-use-after-dtor // RUN: %clang_cc1 -fsanitize=memory -fsanitize-memory-use-after-dtor -std=c++11 -triple=x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s +// Sanitizing dtor is emitted in dtor for every class + struct Simple { + int x; ~Simple() {} }; Simple s; // Simple internal member is poisoned by compiler-generated dtor // CHECK-LABEL: define {{.*}}SimpleD1Ev -// CHECK: call void @__sanitizer_dtor_callback -// CHECK-NOT: call void @__sanitizer_dtor_callback +// CHECK: call void {{.*}}SimpleD2Ev // CHECK: ret void struct Inlined { + int y; inline ~Inlined() {} }; Inlined i; // Simple internal member is poisoned by compiler-generated dtor // CHECK-LABEL: define {{.*}}InlinedD1Ev -// CHECK: call void @__sanitizer_dtor_callback -// CHECK-NOT: call void @__sanitizer_dtor_callback +// CHECK: call void {{.*}}InlinedD2Ev // CHECK: ret void struct Defaulted_Trivial { @@ -32,7 +34,6 @@ void create_def_trivial() { // no destructor defined. // CHECK-LABEL: define {{.*}}create_def_trivial // CHECK-NOT: call {{.*}}Defaulted_Trivial -// CHECK-NOT: call void @__sanitizer_dtor_callback // CHECK: ret void struct Defaulted_Non_Trivial { @@ -44,8 +45,7 @@ Defaulted_Non_Trivial def_non_trivial; // By including a Simple member in the struct, the compiler is // forced to generate a non-trivial destructor. // CHECK-LABEL: define {{.*}}Defaulted_Non_TrivialD1Ev -// CHECK: call void @__sanitizer_dtor_callback -// CHECK-NOT: call void @__sanitizer_dtor_callback +// CHECK: call void {{.*}}Defaulted_Non_TrivialD2 // CHECK: ret void |