@@ -48,23 +48,31 @@ void TestContainer(size_t capacity, size_t off_begin, bool poison_buffer) {
48
48
// bytes after the end.
49
49
for (; cur != end + kGranularity ; ++cur)
50
50
assert (__asan_address_is_poisoned (cur) == poison_buffer);
51
- assert (__sanitizer_verify_contiguous_container (beg, mid, end));
52
- assert (NULL ==
53
- __sanitizer_contiguous_container_find_bad_address (beg, mid, end));
54
- size_t distance = (end > RoundDown (end)) ? kGranularity + 1 : 1 ;
55
- if (mid >= beg + distance) {
56
- assert (
57
- !__sanitizer_verify_contiguous_container (beg, mid - distance, end));
58
- assert (mid - distance ==
59
- __sanitizer_contiguous_container_find_bad_address (
60
- beg, mid - distance, end));
61
- }
51
+ }
52
+
53
+ for (int i = 0 ; i <= capacity; i++) {
54
+ old_mid = mid;
55
+ mid = beg + i;
56
+ __sanitizer_annotate_contiguous_container (beg, end, old_mid, mid);
62
57
63
- if (mid + distance <= end) {
64
- assert (
65
- !__sanitizer_verify_contiguous_container (beg, mid + distance, end));
66
- assert (mid == __sanitizer_contiguous_container_find_bad_address (
67
- beg, mid + distance, end));
58
+ for (char *cur = std::max (beg, mid - 2 * kGranularity );
59
+ cur <= std::min (end, mid + 2 * kGranularity ); ++cur) {
60
+ if (cur == mid ||
61
+ // Any mid in the last unaligned granule is OK, if bytes after the
62
+ // storage are not poisoned.
63
+ (!poison_buffer && RoundDown (end) <= std::min (cur, mid))) {
64
+ assert (__sanitizer_verify_contiguous_container (beg, cur, end));
65
+ assert (NULL == __sanitizer_contiguous_container_find_bad_address (
66
+ beg, cur, end));
67
+ } else if (cur < mid) {
68
+ assert (!__sanitizer_verify_contiguous_container (beg, cur, end));
69
+ assert (cur == __sanitizer_contiguous_container_find_bad_address (
70
+ beg, cur, end));
71
+ } else {
72
+ assert (!__sanitizer_verify_contiguous_container (beg, cur, end));
73
+ assert (mid == __sanitizer_contiguous_container_find_bad_address (
74
+ beg, cur, end));
75
+ }
68
76
}
69
77
}
70
78
0 commit comments