]>
git.proxmox.com Git - rustc.git/blob - src/libcompiler_builtins/compiler-rt/test/asan/TestCases/contiguous_container.cc
1 // RUN: %clangxx_asan -fexceptions -O %s -o %t && %run %t
3 // Test __sanitizer_annotate_contiguous_container.
9 #include <sanitizer/asan_interface.h>
11 void TestContainer(size_t capacity
) {
12 char *beg
= new char[capacity
];
13 char *end
= beg
+ capacity
;
14 char *mid
= beg
+ capacity
;
17 for (int i
= 0; i
< 10000; i
++) {
18 size_t size
= rand() % (capacity
+ 1);
19 assert(size
<= capacity
);
22 __sanitizer_annotate_contiguous_container(beg
, end
, old_mid
, mid
);
24 for (size_t idx
= 0; idx
< size
; idx
++)
25 assert(!__asan_address_is_poisoned(beg
+ idx
));
26 for (size_t idx
= size
; idx
< capacity
; idx
++)
27 assert(__asan_address_is_poisoned(beg
+ idx
));
28 assert(__sanitizer_verify_contiguous_container(beg
, mid
, end
));
30 __sanitizer_contiguous_container_find_bad_address(beg
, mid
, end
));
32 assert(!__sanitizer_verify_contiguous_container(beg
, mid
- 1, end
));
33 assert(mid
- 1 == __sanitizer_contiguous_container_find_bad_address(
37 assert(!__sanitizer_verify_contiguous_container(beg
, mid
+ 1, end
));
38 assert(mid
== __sanitizer_contiguous_container_find_bad_address(
43 // Don't forget to unpoison the whole thing before destroing/reallocating.
44 __sanitizer_annotate_contiguous_container(beg
, end
, mid
, end
);
45 for (size_t idx
= 0; idx
< capacity
; idx
++)
46 assert(!__asan_address_is_poisoned(beg
+ idx
));
50 __attribute__((noinline
))
51 void Throw() { throw 1; }
53 __attribute__((noinline
))
54 void ThrowAndCatch() {
63 __sanitizer_annotate_contiguous_container(x
, x
+ 32, x
+ 32, x
+ 14);
64 assert(!__asan_address_is_poisoned(x
+ 13));
65 assert(__asan_address_is_poisoned(x
+ 14));
67 assert(!__asan_address_is_poisoned(x
+ 13));
68 // FIXME: invert the assertion below once we fix
69 // https://code.google.com/p/address-sanitizer/issues/detail?id=258
70 // This assertion works only w/o UAR.
71 if (!__asan_get_current_fake_stack())
72 assert(!__asan_address_is_poisoned(x
+ 14));
73 __sanitizer_annotate_contiguous_container(x
, x
+ 32, x
+ 14, x
+ 32);
74 assert(!__asan_address_is_poisoned(x
+ 13));
75 assert(!__asan_address_is_poisoned(x
+ 14));
78 int main(int argc
, char **argv
) {
79 int n
= argc
== 1 ? 128 : atoi(argv
[1]);
80 for (int i
= 0; i
<= n
; i
++)