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; 13 struct Foo {virtual void f() {if (P) printf("Foo::f()\n");}}; 14 struct Foo1 : Foo {virtual void f() {if (P) printf("%d\n", __LINE__);}}; 15 struct Foo2 : Foo {virtual void f() {if (P) printf("%d\n", __LINE__);}}; 16 17 Foo *foo[3] = {new Foo, new Foo1, new Foo2}; 18 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 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