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