mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 12:16:06 +00:00

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 llvm-svn: 244933
44 lines
1.2 KiB
C++
44 lines
1.2 KiB
C++
// 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
|
|
|
|
// The no_sanitize_memory attribute, when applied to a destructor,
|
|
// represses emission of sanitizing callback
|
|
|
|
template <class T> class Vector {
|
|
public:
|
|
int size;
|
|
~Vector() {}
|
|
};
|
|
|
|
struct No_San {
|
|
Vector<int> v;
|
|
int x;
|
|
No_San() { }
|
|
__attribute__((no_sanitize_memory)) ~No_San() = default;
|
|
};
|
|
|
|
int main() {
|
|
No_San *ns = new No_San();
|
|
ns->~No_San();
|
|
return 0;
|
|
}
|
|
|
|
// Repressing the sanitization attribute results in no msan
|
|
// instrumentation of the destructor
|
|
// CHECK: define {{.*}}No_SanD1Ev{{.*}} [[ATTRIBUTE:#[0-9]+]]
|
|
// CHECK-NOT: call void {{.*}}sanitizer_dtor_callback
|
|
// CHECK: ret void
|
|
|
|
// CHECK: define {{.*}}No_SanD2Ev{{.*}} [[ATTRIBUTE:#[0-9]+]]
|
|
// CHECK-NOT: call void {{.*}}sanitizer_dtor_callback
|
|
// CHECK: call void {{.*}}VectorIiED2Ev
|
|
// CHECK-NOT: call void {{.*}}sanitizer_dtor_callback
|
|
// CHECK: ret void
|
|
|
|
// CHECK: define {{.*}}VectorIiED2Ev
|
|
// CHECK: call void {{.*}}sanitizer_dtor_callback
|
|
// CHECK: ret void
|
|
|
|
// When attribute is repressed, the destructor does not emit any tail calls
|
|
// CHECK-NOT: attributes [[ATTRIBUTE]] = {{.*}} sanitize_memory
|