nmusgrave created this revision. nmusgrave added reviewers: eugenis, kcc. nmusgrave added a subscriber: cfe-commits.
Simple test case to verify that an instance of a derived class with virtual base is properly poisoned http://reviews.llvm.org/D11733 Files: test/msan/dtor-derived-class.cc Index: test/msan/dtor-derived-class.cc =================================================================== --- /dev/null +++ test/msan/dtor-derived-class.cc @@ -0,0 +1,55 @@ +// RUN: %clangxx_msan %s -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 +// RUN: FileCheck %s < %t.out + +// RUN: %clangxx_msan %s -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 +// RUN: FileCheck %s < %t.out + +// RUN: %clangxx_msan %s -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 +// RUN: FileCheck %s < %t.out + +#include <stdio.h> +#include<sanitizer/msan_interface.h> + +struct Base { + int x_; + Base() { + x_ = 5; + } + virtual ~Base() { } +}; + +struct Derived:public Base { + int y_; + Derived() { + y_ = 10; + } + ~Derived() { } +}; + +int main() { + Derived d; + d.~Derived(); + + if (__msan_test_shadow(&d, sizeof(d)) != -1) + printf("d is poisoned\n"); + else + printf("d is not poisoned\n"); + // CHECK: d is poisoned + + Base *b = new Derived(); + b->~Base(); + + if (__msan_test_shadow(b, sizeof(*b)) != -1) + printf("b is poisoned\n"); + else + printf("b is not poisoned\n"); + // CHECK: b is poisoned + + if (__msan_test_shadow(&b, sizeof(b)) != -1) + printf("*b is poisoned\n"); + else + printf("*b is not poisoned\n"); + // CHECK: *b is not poisoned + + return 0; +}
Index: test/msan/dtor-derived-class.cc =================================================================== --- /dev/null +++ test/msan/dtor-derived-class.cc @@ -0,0 +1,55 @@ +// RUN: %clangxx_msan %s -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 +// RUN: FileCheck %s < %t.out + +// RUN: %clangxx_msan %s -O1 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 +// RUN: FileCheck %s < %t.out + +// RUN: %clangxx_msan %s -O2 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1 +// RUN: FileCheck %s < %t.out + +#include <stdio.h> +#include<sanitizer/msan_interface.h> + +struct Base { + int x_; + Base() { + x_ = 5; + } + virtual ~Base() { } +}; + +struct Derived:public Base { + int y_; + Derived() { + y_ = 10; + } + ~Derived() { } +}; + +int main() { + Derived d; + d.~Derived(); + + if (__msan_test_shadow(&d, sizeof(d)) != -1) + printf("d is poisoned\n"); + else + printf("d is not poisoned\n"); + // CHECK: d is poisoned + + Base *b = new Derived(); + b->~Base(); + + if (__msan_test_shadow(b, sizeof(*b)) != -1) + printf("b is poisoned\n"); + else + printf("b is not poisoned\n"); + // CHECK: b is poisoned + + if (__msan_test_shadow(&b, sizeof(b)) != -1) + printf("*b is poisoned\n"); + else + printf("*b is not poisoned\n"); + // CHECK: *b is not poisoned + + return 0; +}
_______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits