diff options
Diffstat (limited to 'compiler-rt/test/asan')
-rw-r--r-- | compiler-rt/test/asan/TestCases/coverage-pc-buffer.cc | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/compiler-rt/test/asan/TestCases/coverage-pc-buffer.cc b/compiler-rt/test/asan/TestCases/coverage-pc-buffer.cc new file mode 100644 index 00000000000..dd9beafb16b --- /dev/null +++ b/compiler-rt/test/asan/TestCases/coverage-pc-buffer.cc @@ -0,0 +1,49 @@ +// Test __sanitizer_coverage_pc_buffer(). + +// RUN: %clangxx_asan -fsanitize-coverage=edge %stdcxx11 %s -O3 -o %t && %run %t + +// UNSUPPORTED: android + +#include <assert.h> +#include <memory> +#include <sanitizer/coverage_interface.h> +#include <stdint.h> +#include <stdio.h> + +static volatile int sink; +__attribute__((noinline)) void foo() { sink = 1; } + +void assertNotZeroPcs(uintptr_t *buf, uintptr_t size) { + assert(buf); + for (uintptr_t i = 0; i < size; ++i) + assert(buf[i]); +} + +int main() { + uintptr_t buf_size = 1 << 20; + std::unique_ptr<uintptr_t[]> buf(new uintptr_t[buf_size]); + __sanitizer_set_coverage_pc_buffer(buf.get(), buf_size); + + { + uintptr_t sz = __sanitizer_get_coverage_pc_buffer_pos(); + assertNotZeroPcs(buf.get(), sz); + assert(sz); + } + + { + uintptr_t sz = __sanitizer_get_coverage_pc_buffer_pos(); + foo(); + uintptr_t sz1 = __sanitizer_get_coverage_pc_buffer_pos(); + assertNotZeroPcs(buf.get(), sz1); + assert(sz1 > sz); + } + + { + uintptr_t sz = __sanitizer_get_coverage_pc_buffer_pos(); + // reset coverage to 0. + __sanitizer_reset_coverage(); + uintptr_t sz1 = __sanitizer_get_coverage_pc_buffer_pos(); + assertNotZeroPcs(buf.get(), sz1); + assert(sz1 < sz); + } +} |