aboutsummaryrefslogtreecommitdiff
path: root/test/msan/Linux/obstack.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/msan/Linux/obstack.cc')
-rw-r--r--test/msan/Linux/obstack.cc37
1 files changed, 37 insertions, 0 deletions
diff --git a/test/msan/Linux/obstack.cc b/test/msan/Linux/obstack.cc
new file mode 100644
index 000000000000..f1f53be4c9b2
--- /dev/null
+++ b/test/msan/Linux/obstack.cc
@@ -0,0 +1,37 @@
+// RUN: %clangxx_msan -O0 -g %s -o %t && %run %t
+// RUN: %clangxx_msan -O0 -g -DPOSITIVE %s -o %t && not %run %t |& FileCheck %s
+
+#include <obstack.h>
+#include <sanitizer/msan_interface.h>
+#include <stdlib.h>
+
+static void *obstack_chunk_alloc(size_t sz) {
+ return malloc(sz);
+}
+
+static void obstack_chunk_free(void *p) {
+ free(p);
+}
+
+int main(void) {
+ obstack obs;
+ obstack_init(&obs);
+ for (size_t sz = 16; sz < 0xFFFF; sz *= 2) {
+ void *p = obstack_alloc(&obs, sz);
+ int data[10] = {0};
+ obstack_grow(&obs, &data, sizeof(data));
+ obstack_blank(&obs, sz);
+ obstack_grow(&obs, &data, sizeof(data));
+ obstack_int_grow(&obs, 13);
+ p = obstack_finish(&obs);
+#ifdef POSITIVE
+ if (sz == 4096) {
+ __msan_check_mem_is_initialized(p, sizeof(data));
+ __msan_check_mem_is_initialized(p, sizeof(data) + 1);
+ }
+ // CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value
+ // CHECK: #0 0x{{.*}} in main{{.*}}obstack.cc:[[@LINE-30]]
+#endif
+ }
+ obstack_free(&obs, 0);
+}