[compiler-rt] r244521 - test case for poisoning trivial members

Naomi Musgrave via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 10 15:39:09 PDT 2015


Author: nmusgrave
Date: Mon Aug 10 17:39:09 2015
New Revision: 244521

URL: http://llvm.org/viewvc/llvm-project?rev=244521&view=rev
Log:
test case for poisoning trivial members

Summary:
A virtual base class and derived class should only poison their
respective members upon destruction. In particular, trivial members should
be poisoned directly, non-trivial members should be poisoned by their
respective destructors, and references to non-trivial members should be
poisoned.

Reviewers: eugenis, kcc

Differential Revision: http://reviews.llvm.org/D11912

Test case avoids casting to access members

Run configurations to reflect expected runtime failure on assertions.

Simplified access to internal members.

Updated internal member structure of base.

Revised assert in main to verify successful poisoning after dtor.

Verify address of pointer is poisoned.

Fixed assert err.

Cleaned up test by removing extraneous prints, asserts.

Added:
    compiler-rt/trunk/test/msan/dtor-base-access.cc

Added: compiler-rt/trunk/test/msan/dtor-base-access.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/msan/dtor-base-access.cc?rev=244521&view=auto
==============================================================================
--- compiler-rt/trunk/test/msan/dtor-base-access.cc (added)
+++ compiler-rt/trunk/test/msan/dtor-base-access.cc Mon Aug 10 17:39:09 2015
@@ -0,0 +1,51 @@
+// RUN: %clangxx_msan %s -O0 -fsanitize=memory -fsanitize-memory-use-after-dtor -o %t && MSAN_OPTIONS=poison_in_dtor=1 %run %t >%t.out 2>&1
+
+// 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: %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
+
+// XFAIL: *
+
+#include <sanitizer/msan_interface.h>
+#include <assert.h>
+
+class Base {
+ public:
+  int *x_ptr;
+  Base(int *y_ptr) {
+    // store value of subclass member
+    x_ptr = y_ptr;
+  }
+  virtual ~Base();
+};
+
+class Derived : public Base {
+ public:
+  int y;
+  Derived():Base(&y) {
+    y = 10;
+  }
+  ~Derived();
+};
+
+Base::~Base() {
+  // ok access its own member
+  assert(__msan_test_shadow(&this->x_ptr, sizeof(this->x_ptr)) == -1);
+  // bad access subclass member
+  assert(__msan_test_shadow(this->x_ptr, sizeof(*this->x_ptr)) != -1);
+}
+
+Derived::~Derived() {
+  // ok to access its own members
+  assert(__msan_test_shadow(&this->y, sizeof(this->y)) == -1);
+  // ok access base class members
+  assert(__msan_test_shadow(&this->x_ptr, sizeof(this->x_ptr)) == -1);
+}
+
+int main() {
+  Derived *d = new Derived();
+  assert(__msan_test_shadow(&d->x_ptr, sizeof(d->x_ptr)) == -1);
+  d->~Derived();
+  assert(__msan_test_shadow(&d->x_ptr, sizeof(d->x_ptr)) != -1);
+  return 0;
+}




More information about the llvm-commits mailing list