// Build a library with origin tracking and an executable w/o origin tracking. // Test that origin tracking is enabled at runtime. // RUN: %clangxx_lsan -O0 %s -DBUILD_SO -fPIC -shared -o %t-so.so // RUN: %clangxx_lsan -O0 %s -ldl -o %t && not %run %t 2>&1 | FileCheck %s // RUN: %clangxx_lsan -O0 %s -ldl -o %t -DSUPPRESS_LEAK && %run %t #ifdef BUILD_SO # include extern "C" { void *my_alloc(unsigned sz) { return malloc(sz); } } // extern "C" #else // BUILD_SO # include # include # include # include # ifdef SUPPRESS_LEAK extern "C" const char *__lsan_default_suppressions() { return "leak:^$"; } # endif int main(int argc, char **argv) { std::string path = std::string(argv[0]) + "-so.so"; dlerror(); void *handle = dlopen(path.c_str(), RTLD_LAZY); assert(handle != 0); typedef void *(*fn)(unsigned sz); fn my_alloc = (fn)dlsym(handle, "my_alloc"); for (int i = 0; i < 100; ++i) my_alloc(i); dlclose(handle); return 0; } #endif // BUILD_SO // CHECK: Direct leak