// RUN: %clangxx_asan -fsanitize-coverage=bb -DSHARED %s -shared -o %dynamiclib -fPIC %ld_flags_rpath_so // RUN: %clangxx_asan -fsanitize-coverage=func %s -o %t %ld_flags_rpath_exe // RUN: rm -rf %T/coverage_sandboxing_test // RUN: mkdir %T/coverage_sandboxing_test && cd %T/coverage_sandboxing_test // RUN: mkdir vanilla && cd vanilla // RUN: %env_asan_opts=coverage=1:verbosity=1 %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-vanilla // RUN: mkdir ../sandbox1 && cd ../sandbox1 // RUN: %env_asan_opts=coverage=1:verbosity=1 %run %t a 2>&1 | FileCheck %s --check-prefix=CHECK-sandbox // RUN: %sancov unpack coverage_sandboxing_test.sancov.packed // RUN: mkdir ../sandbox2 && cd ../sandbox2 // RUN: %env_asan_opts=coverage=1:verbosity=1 %run %t a b 2>&1 | FileCheck %s --check-prefix=CHECK-sandbox // RUN: %sancov unpack coverage_sandboxing_test.sancov.packed // RUN: cd .. // RUN: %sancov print vanilla/`basename %dynamiclib`*.sancov > vanilla.txt // RUN: %sancov print sandbox1/`basename %dynamiclib`*.sancov > sandbox1.txt // RUN: %sancov print sandbox2/`basename %dynamiclib`*.sancov > sandbox2.txt // RUN: diff vanilla.txt sandbox1.txt // RUN: diff vanilla.txt sandbox2.txt // RUN: rm -r %T/coverage_sandboxing_test // https://code.google.com/p/address-sanitizer/issues/detail?id=263 // XFAIL: android #include <assert.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sanitizer/coverage_interface.h> #define bb0(n) \ case n: \ fprintf(stderr, "foo: %d\n", n); \ break; #define bb1(n) bb0(n) bb0(n + 1) #define bb2(n) bb1(n) bb1(n + 2) #define bb3(n) bb2(n) bb2(n + 4) #define bb4(n) bb3(n) bb3(n + 8) #define bb5(n) bb4(n) bb4(n + 16) #define bb6(n) bb5(n) bb5(n + 32) #define bb7(n) bb6(n) bb6(n + 64) #define bb8(n) bb7(n) bb7(n + 128) #ifdef SHARED void foo(int i) { switch(i) { // 256 basic blocks bb8(0) } } #else extern void foo(int i); int main(int argc, char **argv) { assert(argc <= 3); for (int i = 0; i < 256; i++) foo(i); fprintf(stderr, "PID: %d\n", getpid()); if (argc == 1) { // Vanilla mode, dump to individual files. return 0; } // Dump to packed file. int fd = creat("coverage_sandboxing_test.sancov.packed", 0660); __sanitizer_sandbox_arguments args = {0}; args.coverage_sandboxed = 1; args.coverage_fd = fd; if (argc == 2) // Write to packed file, do not split into blocks. args.coverage_max_block_size = 0; else if (argc == 3) // Write to packed file, split into blocks (as if writing to a socket). args.coverage_max_block_size = 100; __sanitizer_sandbox_on_notify(&args); return 0; } #endif // CHECK-vanilla: PID: [[PID:[0-9]+]] // CHECK-vanilla: .so.[[PID]].sancov: 257 PCs written // CHECK-vanilla: [[PID]].sancov: 1 PCs written // CHECK-sandbox: PID: [[PID:[0-9]+]] // CHECK-sandbox: 257 PCs written to packed file