xref: /aosp_15_r20/external/compiler-rt/test/asan/TestCases/Posix/coverage-direct.cc (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot // Test for direct coverage writing with dlopen at coverage level 1 to 3.
2*7c3d14c8STreehugger Robot 
3*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=func -DSHARED %s -shared -o %dynamiclib -fPIC
4*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=func %s %libdl -o %t
5*7c3d14c8STreehugger Robot 
6*7c3d14c8STreehugger Robot // RUN: rm -rf %T/coverage-direct
7*7c3d14c8STreehugger Robot 
8*7c3d14c8STreehugger Robot // RUN: mkdir -p %T/coverage-direct/normal
9*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage=1:coverage_direct=0:coverage_dir=%T/coverage-direct/normal:verbosity=1 %run %t %dynamiclib
10*7c3d14c8STreehugger Robot // RUN: %sancov print %T/coverage-direct/normal/*.sancov >%T/coverage-direct/normal/out.txt
11*7c3d14c8STreehugger Robot 
12*7c3d14c8STreehugger Robot // RUN: mkdir -p %T/coverage-direct/direct
13*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage=1:coverage_direct=1:coverage_dir=%T/coverage-direct/direct:verbosity=1 %run %t %dynamiclib
14*7c3d14c8STreehugger Robot // RUN: cd %T/coverage-direct/direct
15*7c3d14c8STreehugger Robot // RUN: %sancov rawunpack *.sancov.raw
16*7c3d14c8STreehugger Robot // RUN: %sancov print *.sancov >out.txt
17*7c3d14c8STreehugger Robot // RUN: cd ../..
18*7c3d14c8STreehugger Robot 
19*7c3d14c8STreehugger Robot // RUN: diff -u coverage-direct/normal/out.txt coverage-direct/direct/out.txt
20*7c3d14c8STreehugger Robot 
21*7c3d14c8STreehugger Robot 
22*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=bb -DSHARED %s -shared -o %dynamiclib -fPIC
23*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=bb -DSO_DIR=\"%T\" %s %libdl -o %t
24*7c3d14c8STreehugger Robot 
25*7c3d14c8STreehugger Robot // RUN: rm -rf %T/coverage-direct
26*7c3d14c8STreehugger Robot 
27*7c3d14c8STreehugger Robot // RUN: mkdir -p %T/coverage-direct/normal
28*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage=1:coverage_direct=0:coverage_dir=%T/coverage-direct/normal:verbosity=1 %run %t %dynamiclib
29*7c3d14c8STreehugger Robot // RUN: %sancov print %T/coverage-direct/normal/*.sancov >%T/coverage-direct/normal/out.txt
30*7c3d14c8STreehugger Robot 
31*7c3d14c8STreehugger Robot // RUN: mkdir -p %T/coverage-direct/direct
32*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage=1:coverage_direct=1:coverage_dir=%T/coverage-direct/direct:verbosity=1 %run %t %dynamiclib
33*7c3d14c8STreehugger Robot // RUN: cd %T/coverage-direct/direct
34*7c3d14c8STreehugger Robot // RUN: %sancov rawunpack *.sancov.raw
35*7c3d14c8STreehugger Robot // RUN: %sancov print *.sancov >out.txt
36*7c3d14c8STreehugger Robot // RUN: cd ../..
37*7c3d14c8STreehugger Robot 
38*7c3d14c8STreehugger Robot // RUN: diff -u coverage-direct/normal/out.txt coverage-direct/direct/out.txt
39*7c3d14c8STreehugger Robot 
40*7c3d14c8STreehugger Robot 
41*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=edge -DSHARED %s -shared -o %dynamiclib -fPIC
42*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=edge -DSO_DIR=\"%T\" %s %libdl -o %t
43*7c3d14c8STreehugger Robot 
44*7c3d14c8STreehugger Robot // RUN: rm -rf %T/coverage-direct
45*7c3d14c8STreehugger Robot 
46*7c3d14c8STreehugger Robot // RUN: mkdir -p %T/coverage-direct/normal
47*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage=1:coverage_direct=0:coverage_dir=%T/coverage-direct/normal:verbosity=1 %run %t %dynamiclib
48*7c3d14c8STreehugger Robot // RUN: %sancov print %T/coverage-direct/normal/*.sancov >%T/coverage-direct/normal/out.txt
49*7c3d14c8STreehugger Robot 
50*7c3d14c8STreehugger Robot // RUN: mkdir -p %T/coverage-direct/direct
51*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage=1:coverage_direct=1:coverage_dir=%T/coverage-direct/direct:verbosity=1 %run %t %dynamiclib
52*7c3d14c8STreehugger Robot // RUN: cd %T/coverage-direct/direct
53*7c3d14c8STreehugger Robot // RUN: %sancov rawunpack *.sancov.raw
54*7c3d14c8STreehugger Robot // RUN: %sancov print *.sancov >out.txt
55*7c3d14c8STreehugger Robot // RUN: cd ../..
56*7c3d14c8STreehugger Robot 
57*7c3d14c8STreehugger Robot // RUN: diff -u coverage-direct/normal/out.txt coverage-direct/direct/out.txt
58*7c3d14c8STreehugger Robot 
59*7c3d14c8STreehugger Robot // XFAIL: android
60*7c3d14c8STreehugger Robot 
61*7c3d14c8STreehugger Robot #include <assert.h>
62*7c3d14c8STreehugger Robot #include <dlfcn.h>
63*7c3d14c8STreehugger Robot #include <stdio.h>
64*7c3d14c8STreehugger Robot #include <unistd.h>
65*7c3d14c8STreehugger Robot 
66*7c3d14c8STreehugger Robot #ifdef SHARED
67*7c3d14c8STreehugger Robot extern "C" {
bar()68*7c3d14c8STreehugger Robot void bar() { printf("bar\n"); }
69*7c3d14c8STreehugger Robot }
70*7c3d14c8STreehugger Robot #else
71*7c3d14c8STreehugger Robot 
main(int argc,char ** argv)72*7c3d14c8STreehugger Robot int main(int argc, char **argv) {
73*7c3d14c8STreehugger Robot   fprintf(stderr, "PID: %d\n", getpid());
74*7c3d14c8STreehugger Robot   assert(argc > 1);
75*7c3d14c8STreehugger Robot   void *handle1 = dlopen(argv[1], RTLD_LAZY);
76*7c3d14c8STreehugger Robot   assert(handle1);
77*7c3d14c8STreehugger Robot   void (*bar1)() = (void (*)())dlsym(handle1, "bar");
78*7c3d14c8STreehugger Robot   assert(bar1);
79*7c3d14c8STreehugger Robot   bar1();
80*7c3d14c8STreehugger Robot 
81*7c3d14c8STreehugger Robot   return 0;
82*7c3d14c8STreehugger Robot }
83*7c3d14c8STreehugger Robot #endif
84