diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2015-09-06 18:41:23 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2015-09-06 18:41:23 +0000 |
commit | f31bcc68c72371a2bf63aead9f3373a1ff2053b6 (patch) | |
tree | b259e5d585da0f8cde9579939a74d5ef44c72abd /test/asan/TestCases/coverage-reset.cc | |
parent | cd2dd3df15523e2be8d2bbace27641d6ac9fa40d (diff) | |
download | src-f31bcc68c72371a2bf63aead9f3373a1ff2053b6.tar.gz src-f31bcc68c72371a2bf63aead9f3373a1ff2053b6.zip |
Import compiler-rt 3.7.0 release (r246257).vendor/compiler-rt/compiler-rt-release_370-r246257
Notes
Notes:
svn path=/vendor/compiler-rt/dist/; revision=287516
svn path=/vendor/compiler-rt/compiler-rt-release_370-r246257/; revision=287517; tag=vendor/compiler-rt/compiler-rt-release_370-r246257
Diffstat (limited to 'test/asan/TestCases/coverage-reset.cc')
-rw-r--r-- | test/asan/TestCases/coverage-reset.cc | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/test/asan/TestCases/coverage-reset.cc b/test/asan/TestCases/coverage-reset.cc new file mode 100644 index 000000000000..8e025600fda7 --- /dev/null +++ b/test/asan/TestCases/coverage-reset.cc @@ -0,0 +1,52 @@ +// Test __sanitizer_reset_coverage(). + +// RUN: %clangxx_asan -fsanitize-coverage=func %s -o %t +// RUN: env ASAN_OPTIONS=$ASAN_OPTIONS:coverage=1 %run %t + +#include <sanitizer/coverage_interface.h> +#include <stdio.h> +#include <assert.h> +static volatile int sink; +__attribute__((noinline)) void bar() { sink = 2; } +__attribute__((noinline)) void foo() { sink = 1; } + +#define GET_AND_PRINT_COVERAGE() \ + bitset = 0; \ + for (size_t i = 0; i < n_guards; i++) \ + if (guards[i]) bitset |= 1U << i; \ + printf("line %d: bitset %zd total: %zd\n", __LINE__, bitset, \ + __sanitizer_get_total_unique_coverage()); + +#define IS_POWER_OF_TWO(a) ((a & ((a) - 1)) == 0) + +int main() { + size_t *guards = 0; + size_t bitset; + size_t n_guards = __sanitizer_get_coverage_guards(&guards); + + GET_AND_PRINT_COVERAGE(); + size_t main_bit = bitset; + assert(IS_POWER_OF_TWO(main_bit)); + + foo(); + GET_AND_PRINT_COVERAGE(); + size_t foo_bit = bitset & ~main_bit; + assert(IS_POWER_OF_TWO(foo_bit)); + + bar(); + GET_AND_PRINT_COVERAGE(); + size_t bar_bit = bitset & ~(main_bit | foo_bit); + assert(IS_POWER_OF_TWO(bar_bit)); + + __sanitizer_reset_coverage(); + GET_AND_PRINT_COVERAGE(); + assert(bitset == 0); + + foo(); + GET_AND_PRINT_COVERAGE(); + assert(bitset == foo_bit); + + bar(); + GET_AND_PRINT_COVERAGE(); + assert(bitset == (foo_bit | bar_bit)); +} |