Home | History | Annotate | Download | only in Linux
      1 // Test for direct coverage writing with dlopen.
      2 // RUN: %clangxx_asan -mllvm -asan-coverage=1 -DSHARED %s -shared -o %T/libcoverage_direct_test_1.so -fPIC
      3 // RUN: %clangxx_asan -mllvm -asan-coverage=1 -DSO_DIR=\"%T\" %s -o %t
      4 
      5 // RUN: rm -rf %T/coverage-direct
      6 
      7 // RUN: mkdir -p %T/coverage-direct/normal
      8 // RUN: ASAN_OPTIONS=coverage=1:coverage_direct=0:coverage_dir=%T/coverage-direct/normal:verbosity=1 %run %t
      9 // RUN: %sancov print %T/coverage-direct/normal/*.sancov >%T/coverage-direct/normal/out.txt
     10 
     11 // RUN: mkdir -p %T/coverage-direct/direct
     12 // RUN: ASAN_OPTIONS=coverage=1:coverage_direct=1:coverage_dir=%T/coverage-direct/direct:verbosity=1 %run %t
     13 // RUN: cd %T/coverage-direct/direct
     14 // RUN: %sancov rawunpack *.sancov.raw
     15 // RUN: %sancov print *.sancov >out.txt
     16 // RUN: cd ../..
     17 
     18 // RUN: diff -u coverage-direct/normal/out.txt coverage-direct/direct/out.txt
     19 //
     20 // XFAIL: android
     21 
     22 #include <assert.h>
     23 #include <dlfcn.h>
     24 #include <stdio.h>
     25 #include <unistd.h>
     26 
     27 #ifdef SHARED
     28 extern "C" {
     29 void bar() { printf("bar\n"); }
     30 }
     31 #else
     32 
     33 int main(int argc, char **argv) {
     34   fprintf(stderr, "PID: %d\n", getpid());
     35   void *handle1 =
     36       dlopen(SO_DIR "/libcoverage_direct_test_1.so", RTLD_LAZY);
     37   assert(handle1);
     38   void (*bar1)() = (void (*)())dlsym(handle1, "bar");
     39   assert(bar1);
     40   bar1();
     41 
     42   return 0;
     43 }
     44 #endif
     45