xref: /aosp_15_r20/external/compiler-rt/test/asan/TestCases/Android/coverage-android.cc (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot // Test for direct coverage writing with dlopen.
2*7c3d14c8STreehugger Robot 
3*7c3d14c8STreehugger Robot // Test normal exit, coverage level 1.
4*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=func -DSHARED %s -shared -o %T/libcoverage_android_test_1.so -fPIC
5*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=func -DSO_DIR=\"%device\" %s -o %t
6*7c3d14c8STreehugger Robot 
7*7c3d14c8STreehugger Robot // RUN: adb shell rm -rf %device/coverage-android
8*7c3d14c8STreehugger Robot // RUN: rm -rf %T/coverage-android
9*7c3d14c8STreehugger Robot 
10*7c3d14c8STreehugger Robot // RUN: adb shell mkdir -p %device/coverage-android/direct
11*7c3d14c8STreehugger Robot // RUN: mkdir -p %T/coverage-android/direct
12*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage=1:coverage_direct=1:coverage_dir=%device/coverage-android/direct:verbosity=1 %run %t
13*7c3d14c8STreehugger Robot // RUN: adb pull %device/coverage-android/direct %T/coverage-android/direct
14*7c3d14c8STreehugger Robot // RUN: ls; pwd
15*7c3d14c8STreehugger Robot // RUN: cd %T/coverage-android/direct
16*7c3d14c8STreehugger Robot // RUN: %sancov rawunpack *.sancov.raw
17*7c3d14c8STreehugger Robot // RUN: %sancov print *.sancov |& FileCheck --check-prefix=CHECK1 %s
18*7c3d14c8STreehugger Robot 
19*7c3d14c8STreehugger Robot 
20*7c3d14c8STreehugger Robot // Test sudden death, coverage level 1.
21*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=func -DSHARED -DKILL %s -shared -o %T/libcoverage_android_test_1.so -fPIC
22*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=func -DSO_DIR=\"%device\" %s -o %t
23*7c3d14c8STreehugger Robot 
24*7c3d14c8STreehugger Robot // RUN: adb shell rm -rf %device/coverage-android-kill
25*7c3d14c8STreehugger Robot // RUN: rm -rf %T/coverage-android-kill
26*7c3d14c8STreehugger Robot 
27*7c3d14c8STreehugger Robot // RUN: adb shell mkdir -p %device/coverage-android-kill/direct
28*7c3d14c8STreehugger Robot // RUN: mkdir -p %T/coverage-android-kill/direct
29*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage=1:coverage_direct=1:coverage_dir=%device/coverage-android-kill/direct:verbosity=1 not %run %t
30*7c3d14c8STreehugger Robot // RUN: adb pull %device/coverage-android-kill/direct %T/coverage-android-kill/direct
31*7c3d14c8STreehugger Robot // RUN: ls; pwd
32*7c3d14c8STreehugger Robot // RUN: cd %T/coverage-android-kill/direct
33*7c3d14c8STreehugger Robot // RUN: %sancov rawunpack *.sancov.raw
34*7c3d14c8STreehugger Robot // RUN: %sancov print *.sancov |& FileCheck --check-prefix=CHECK1 %s
35*7c3d14c8STreehugger Robot 
36*7c3d14c8STreehugger Robot 
37*7c3d14c8STreehugger Robot // Test normal exit, coverage level 2.
38*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=bb -DSHARED %s -shared -o %T/libcoverage_android_test_1.so -fPIC
39*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=bb -DSO_DIR=\"%device\" %s -o %t
40*7c3d14c8STreehugger Robot 
41*7c3d14c8STreehugger Robot // RUN: adb shell rm -rf %device/coverage-android
42*7c3d14c8STreehugger Robot // RUN: rm -rf %T/coverage-android
43*7c3d14c8STreehugger Robot 
44*7c3d14c8STreehugger Robot // RUN: adb shell mkdir -p %device/coverage-android/direct
45*7c3d14c8STreehugger Robot // RUN: mkdir -p %T/coverage-android/direct
46*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage=1:coverage_direct=1:coverage_dir=%device/coverage-android/direct:verbosity=1 %run %t
47*7c3d14c8STreehugger Robot // RUN: adb pull %device/coverage-android/direct %T/coverage-android/direct
48*7c3d14c8STreehugger Robot // RUN: ls; pwd
49*7c3d14c8STreehugger Robot // RUN: cd %T/coverage-android/direct
50*7c3d14c8STreehugger Robot // RUN: %sancov rawunpack *.sancov.raw
51*7c3d14c8STreehugger Robot // RUN: %sancov print *.sancov |& FileCheck --check-prefix=CHECK2 %s
52*7c3d14c8STreehugger Robot 
53*7c3d14c8STreehugger Robot 
54*7c3d14c8STreehugger Robot // Test sudden death, coverage level 2.
55*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=bb -DSHARED -DKILL %s -shared -o %T/libcoverage_android_test_1.so -fPIC
56*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=bb -DSO_DIR=\"%device\" %s -o %t
57*7c3d14c8STreehugger Robot 
58*7c3d14c8STreehugger Robot // RUN: adb shell rm -rf %device/coverage-android-kill
59*7c3d14c8STreehugger Robot // RUN: rm -rf %T/coverage-android-kill
60*7c3d14c8STreehugger Robot 
61*7c3d14c8STreehugger Robot // RUN: adb shell mkdir -p %device/coverage-android-kill/direct
62*7c3d14c8STreehugger Robot // RUN: mkdir -p %T/coverage-android-kill/direct
63*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage=1:coverage_direct=1:coverage_dir=%device/coverage-android-kill/direct:verbosity=1 not %run %t
64*7c3d14c8STreehugger Robot // RUN: adb pull %device/coverage-android-kill/direct %T/coverage-android-kill/direct
65*7c3d14c8STreehugger Robot // RUN: ls; pwd
66*7c3d14c8STreehugger Robot // RUN: cd %T/coverage-android-kill/direct
67*7c3d14c8STreehugger Robot // RUN: %sancov rawunpack *.sancov.raw
68*7c3d14c8STreehugger Robot // RUN: %sancov print *.sancov |& FileCheck --check-prefix=CHECK2 %s
69*7c3d14c8STreehugger Robot 
70*7c3d14c8STreehugger Robot 
71*7c3d14c8STreehugger Robot // Test normal exit, coverage level 3.
72*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=edge -DSHARED %s -shared -o %T/libcoverage_android_test_1.so -fPIC
73*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=edge -DSO_DIR=\"%device\" %s -o %t
74*7c3d14c8STreehugger Robot 
75*7c3d14c8STreehugger Robot // RUN: adb shell rm -rf %device/coverage-android
76*7c3d14c8STreehugger Robot // RUN: rm -rf %T/coverage-android
77*7c3d14c8STreehugger Robot 
78*7c3d14c8STreehugger Robot // RUN: adb shell mkdir -p %device/coverage-android/direct
79*7c3d14c8STreehugger Robot // RUN: mkdir -p %T/coverage-android/direct
80*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage=1:coverage_direct=1:coverage_dir=%device/coverage-android/direct:verbosity=1 %run %t
81*7c3d14c8STreehugger Robot // RUN: adb pull %device/coverage-android/direct %T/coverage-android/direct
82*7c3d14c8STreehugger Robot // RUN: ls; pwd
83*7c3d14c8STreehugger Robot // RUN: cd %T/coverage-android/direct
84*7c3d14c8STreehugger Robot // RUN: %sancov rawunpack *.sancov.raw
85*7c3d14c8STreehugger Robot // RUN: %sancov print *.sancov |& FileCheck --check-prefix=CHECK3 %s
86*7c3d14c8STreehugger Robot 
87*7c3d14c8STreehugger Robot 
88*7c3d14c8STreehugger Robot // Test sudden death, coverage level 3.
89*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=edge -DSHARED -DKILL %s -shared -o %T/libcoverage_android_test_1.so -fPIC
90*7c3d14c8STreehugger Robot // RUN: %clangxx_asan -fsanitize-coverage=edge -DSO_DIR=\"%device\" %s -o %t
91*7c3d14c8STreehugger Robot 
92*7c3d14c8STreehugger Robot // RUN: adb shell rm -rf %device/coverage-android-kill
93*7c3d14c8STreehugger Robot // RUN: rm -rf %T/coverage-android-kill
94*7c3d14c8STreehugger Robot 
95*7c3d14c8STreehugger Robot // RUN: adb shell mkdir -p %device/coverage-android-kill/direct
96*7c3d14c8STreehugger Robot // RUN: mkdir -p %T/coverage-android-kill/direct
97*7c3d14c8STreehugger Robot // RUN: %env_asan_opts=coverage=1:coverage_direct=1:coverage_dir=%device/coverage-android-kill/direct:verbosity=1 not %run %t
98*7c3d14c8STreehugger Robot // RUN: adb pull %device/coverage-android-kill/direct %T/coverage-android-kill/direct
99*7c3d14c8STreehugger Robot // RUN: ls; pwd
100*7c3d14c8STreehugger Robot // RUN: cd %T/coverage-android-kill/direct
101*7c3d14c8STreehugger Robot // RUN: %sancov rawunpack *.sancov.raw
102*7c3d14c8STreehugger Robot // RUN: %sancov print *.sancov |& FileCheck --check-prefix=CHECK3 %s
103*7c3d14c8STreehugger Robot 
104*7c3d14c8STreehugger Robot #include <assert.h>
105*7c3d14c8STreehugger Robot #include <dlfcn.h>
106*7c3d14c8STreehugger Robot #include <stdio.h>
107*7c3d14c8STreehugger Robot #include <unistd.h>
108*7c3d14c8STreehugger Robot #include <sys/types.h>
109*7c3d14c8STreehugger Robot #include <signal.h>
110*7c3d14c8STreehugger Robot 
111*7c3d14c8STreehugger Robot #ifdef SHARED
112*7c3d14c8STreehugger Robot extern "C" {
bar()113*7c3d14c8STreehugger Robot void bar() {
114*7c3d14c8STreehugger Robot   printf("bar\n");
115*7c3d14c8STreehugger Robot #ifdef KILL
116*7c3d14c8STreehugger Robot   kill(getpid(), SIGKILL);
117*7c3d14c8STreehugger Robot #endif
118*7c3d14c8STreehugger Robot }
119*7c3d14c8STreehugger Robot }
120*7c3d14c8STreehugger Robot #else
121*7c3d14c8STreehugger Robot 
122*7c3d14c8STreehugger Robot volatile int sink;
123*7c3d14c8STreehugger Robot 
main(int argc,char ** argv)124*7c3d14c8STreehugger Robot int main(int argc, char **argv) {
125*7c3d14c8STreehugger Robot   fprintf(stderr, "PID: %d\n", getpid());
126*7c3d14c8STreehugger Robot   void *handle1 =
127*7c3d14c8STreehugger Robot       dlopen(SO_DIR "/libcoverage_android_test_1.so", RTLD_LAZY);
128*7c3d14c8STreehugger Robot   assert(handle1);
129*7c3d14c8STreehugger Robot 
130*7c3d14c8STreehugger Robot   if (argc == 0)
131*7c3d14c8STreehugger Robot     sink = 0;
132*7c3d14c8STreehugger Robot 
133*7c3d14c8STreehugger Robot   void (*bar1)() = (void (*)())dlsym(handle1, "bar");
134*7c3d14c8STreehugger Robot   assert(bar1);
135*7c3d14c8STreehugger Robot   bar1();
136*7c3d14c8STreehugger Robot 
137*7c3d14c8STreehugger Robot   return 0;
138*7c3d14c8STreehugger Robot }
139*7c3d14c8STreehugger Robot #endif
140*7c3d14c8STreehugger Robot 
141*7c3d14c8STreehugger Robot // CHECK1: 2 PCs total
142*7c3d14c8STreehugger Robot // CHECK2: 4 PCs total
143*7c3d14c8STreehugger Robot // CHECK3: 5 PCs total
144