summaryrefslogtreecommitdiff
path: root/test/asan/TestCases/Windows/heapalloc_transfer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/asan/TestCases/Windows/heapalloc_transfer.cpp')
-rw-r--r--test/asan/TestCases/Windows/heapalloc_transfer.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/test/asan/TestCases/Windows/heapalloc_transfer.cpp b/test/asan/TestCases/Windows/heapalloc_transfer.cpp
new file mode 100644
index 000000000..497d36b41
--- /dev/null
+++ b/test/asan/TestCases/Windows/heapalloc_transfer.cpp
@@ -0,0 +1,28 @@
+#include "sanitizer\allocator_interface.h"
+#include <cassert>
+#include <stdio.h>
+#include <windows.h>
+// RUN: %clang_cl_asan %s -o%t
+// RUN: %env_asan_opts=windows_hook_rtl_allocators=true %run %t 2>&1 | FileCheck %s
+// UNSUPPORTED: asan-64-bits
+
+int main() {
+ //owned by rtl
+ void *alloc = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, 100);
+ assert(alloc);
+ // still owned by rtl
+ alloc = HeapReAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, alloc, 100);
+ assert(alloc && !__sanitizer_get_ownership(alloc) && HeapValidate(GetProcessHeap(), 0, alloc));
+ //convert to asan owned
+ void *realloc = HeapReAlloc(GetProcessHeap(), 0, alloc, 500);
+ alloc = nullptr;
+ assert(realloc && __sanitizer_get_ownership(realloc));
+ //convert back to rtl owned;
+ alloc = HeapReAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS, realloc, 100);
+ assert(alloc && !__sanitizer_get_ownership(alloc) && HeapValidate(GetProcessHeap(), 0, alloc));
+ printf("Success\n");
+}
+
+// CHECK-NOT: assert
+// CHECK-NOT: AddressSanitizer
+// CHECK: Success \ No newline at end of file