• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Test __sanitizer_get_total_unique_coverage for caller-callee coverage
2 
3 // RUN: %clangxx_asan -fsanitize-coverage=edge,indirect-calls %s -o %t
4 // RUN: %env_asan_opts=coverage=1 %run %t
5 // RUN: rm -f caller-callee*.sancov
6 //
7 // REQUIRES: asan-64-bits
8 
9 #include <sanitizer/coverage_interface.h>
10 #include <stdio.h>
11 #include <assert.h>
12 int P = 0;
fFoo13 struct Foo {virtual void f() {if (P) printf("Foo::f()\n");}};
fFoo114 struct Foo1 : Foo {virtual void f() {if (P) printf("%d\n", __LINE__);}};
fFoo215 struct Foo2 : Foo {virtual void f() {if (P) printf("%d\n", __LINE__);}};
16 
17 Foo *foo[3] = {new Foo, new Foo1, new Foo2};
18 
CheckNewTotalUniqueCoverageIsLargerAndReturnIt(uintptr_t old_total)19 uintptr_t CheckNewTotalUniqueCoverageIsLargerAndReturnIt(uintptr_t old_total) {
20   uintptr_t new_total = __sanitizer_get_total_unique_caller_callee_pairs();
21   fprintf(stderr, "Caller-Callee: old %zd new %zd\n", old_total, new_total);
22   assert(new_total > old_total);
23   return new_total;
24 }
25 
main(int argc,char ** argv)26 int main(int argc, char **argv) {
27   uintptr_t total = __sanitizer_get_total_unique_caller_callee_pairs();
28   foo[0]->f();
29   total = CheckNewTotalUniqueCoverageIsLargerAndReturnIt(total);
30   foo[1]->f();
31   total = CheckNewTotalUniqueCoverageIsLargerAndReturnIt(total);
32   foo[2]->f();
33   total = CheckNewTotalUniqueCoverageIsLargerAndReturnIt(total);
34   // Ok, called every function once.
35   // Now call them again from another call site. Should get new coverage.
36   foo[0]->f();
37   total = CheckNewTotalUniqueCoverageIsLargerAndReturnIt(total);
38   foo[1]->f();
39   total = CheckNewTotalUniqueCoverageIsLargerAndReturnIt(total);
40   foo[2]->f();
41   total = CheckNewTotalUniqueCoverageIsLargerAndReturnIt(total);
42 }
43