49 lines · cpp
1// Build a library with origin tracking and an executable w/o origin tracking.2// Test that origin tracking is enabled at runtime.3// RUN: %clangxx_lsan -O0 %s -DBUILD_SO -fPIC -shared -o %t-so.so4// RUN: %clangxx_lsan -O0 %s -ldl -o %t && not %run %t 2>&1 | FileCheck %s5// RUN: %clangxx_lsan -O0 %s -ldl -o %t -DSUPPRESS_LEAK && %run %t6 7#ifdef BUILD_SO8 9# include <stdlib.h>10 11extern "C" {12void *my_alloc(unsigned sz) { return malloc(sz); }13} // extern "C"14 15#else // BUILD_SO16 17# include <assert.h>18# include <dlfcn.h>19# include <stdlib.h>20# include <string>21 22# ifdef SUPPRESS_LEAK23extern "C" const char *__lsan_default_suppressions() {24 return "leak:^<unknown module>$";25}26# endif27 28int main(int argc, char **argv) {29 30 std::string path = std::string(argv[0]) + "-so.so";31 32 dlerror();33 34 void *handle = dlopen(path.c_str(), RTLD_LAZY);35 assert(handle != 0);36 typedef void *(*fn)(unsigned sz);37 fn my_alloc = (fn)dlsym(handle, "my_alloc");38 39 for (int i = 0; i < 100; ++i)40 my_alloc(i);41 42 dlclose(handle);43 return 0;44}45 46#endif // BUILD_SO47 48// CHECK: Direct leak49