1// Test for "sancov.py missing ...".
2
3// First case: coverage from executable. main() is called on every code path.
4// RUN: %clangxx_asan -fsanitize-coverage=func,trace-pc-guard %s -o %t -DFOOBAR -DMAIN
5// RUN: rm -rf %t-dir
6// RUN: mkdir -p %t-dir
7// RUN: cd %t-dir
8// RUN: %env_asan_opts=coverage=1:coverage_dir=%t-dir %run %t
9// RUN: %sancov print *.sancov > main.txt
10// RUN: rm *.sancov
11// RUN: count 1 < main.txt
12// RUN: %env_asan_opts=coverage=1:coverage_dir=%t-dir %run %t x
13// RUN: %sancov print *.sancov > foo.txt
14// RUN: rm *.sancov
15// RUN: count 3 < foo.txt
16// RUN: %env_asan_opts=coverage=1:coverage_dir=%t-dir %run %t x x
17// RUN: %sancov print *.sancov > bar.txt
18// RUN: rm *.sancov
19// RUN: count 4 < bar.txt
20// RUN: %sancov missing %t < foo.txt > foo-missing.txt
21// RUN: sort main.txt foo-missing.txt -o foo-missing-with-main.txt
22// The "missing from foo" set may contain a few bogus PCs from the sanitizer
23// runtime, but it must include the entire "bar" code path as a subset. Sorted
24// lists can be tested for set inclusion with diff + grep.
25// RUN: diff bar.txt foo-missing-with-main.txt > %t.log || true
26// RUN: not grep "^<" %t.log
27
28// Second case: coverage from DSO.
29// cd %t-dir
30// RUN: %clangxx_asan -fsanitize-coverage=func,trace-pc-guard %s -o %dynamiclib -DFOOBAR -shared -fPIC
31// RUN: %clangxx_asan -fsanitize-coverage=func,trace-pc-guard %s %dynamiclib -o %t -DMAIN
32// RUN: cd ..
33// RUN: rm -rf %t-dir
34// RUN: mkdir -p %t-dir
35// RUN: cd %t-dir
36// RUN: %env_asan_opts=coverage=1:coverage_dir=%t-dir %run %t x
37// RUN: %sancov print %xdynamiclib_filename.*.sancov > foo.txt
38// RUN: rm *.sancov
39// RUN: count 2 < foo.txt
40// RUN: %env_asan_opts=coverage=1:coverage_dir=%t-dir %run %t x x
41// RUN: %sancov print %xdynamiclib_filename.*.sancov > bar.txt
42// RUN: rm *.sancov
43// RUN: count 3 < bar.txt
44// RUN: %sancov missing %dynamiclib < foo.txt > foo-missing.txt
45// RUN: diff bar.txt foo-missing.txt > %t.log || true
46// RUN: not grep "^<" %t.log
47
48// FIXME %sancov GetInstrumentedPCs relies on objdump -d to
49// obtain the number of instrumented PCs. The i386
50// %dynamiclib has .plt entries that are not recognized by
51// objdump,
52// "sancov.py: found 0 instrumented PCs in *.so",
53// causing AddressSanitizer-i386-linux to fail.
54// Change it back to x86-target-arch after %sancov switches to a more robust approach.
55
56// REQUIRES: x86_64-target-arch
57// XFAIL: android
58
59#include <stdio.h>
60
61void foo1();
62void foo2();
63void bar1();
64void bar2();
65void bar3();
66
67#if defined(FOOBAR)
68void foo1() { fprintf(stderr, "foo1\n"); }
69void foo2() { fprintf(stderr, "foo2\n"); }
70
71void bar1() { fprintf(stderr, "bar1\n"); }
72void bar2() { fprintf(stderr, "bar2\n"); }
73void bar3() { fprintf(stderr, "bar3\n"); }
74#endif
75
76#if defined(MAIN)
77int main(int argc, char **argv) {
78 switch (argc) {
79 case 1:
80 break;
81 case 2:
82 foo1();
83 foo2();
84 break;
85 case 3:
86 bar1();
87 bar2();
88 bar3();
89 break;
90 }
91}
92#endif
93

source code of compiler-rt/test/asan/TestCases/Linux/coverage-missing.cpp