forked from OSchip/llvm-project
[lsan] Add leak_check_at_exit flag.
We needed a way to tell LSan to invoke leak checking only if __do_leak_check() is called explicitly. This can now be achieved by setting leak_check_at_exit=false. llvm-svn: 187578
This commit is contained in:
parent
9688ff197e
commit
6459a370a7
|
@ -137,6 +137,7 @@ void InitializeFlags(Flags *f, const char *env) {
|
|||
cf->handle_ioctl = false;
|
||||
cf->log_path = 0;
|
||||
cf->detect_leaks = false;
|
||||
cf->leak_check_at_exit = true;
|
||||
|
||||
internal_memset(f, 0, sizeof(*f));
|
||||
f->quarantine_size = (ASAN_LOW_MEMORY) ? 1UL << 26 : 1UL << 28;
|
||||
|
@ -556,7 +557,7 @@ void __asan_init() {
|
|||
|
||||
#if CAN_SANITIZE_LEAKS
|
||||
__lsan::InitCommonLsan();
|
||||
if (common_flags()->detect_leaks) {
|
||||
if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit) {
|
||||
Atexit(__lsan::DoLeakCheck);
|
||||
}
|
||||
#endif // CAN_SANITIZE_LEAKS
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
// Test for the leak_check_at_exit flag.
|
||||
// RUN: %clangxx_lsan %s -o %t
|
||||
// RUN: LSAN_OPTIONS="verbosity=1" %t foo 2>&1 | FileCheck %s --check-prefix=CHECK-do
|
||||
// RUN: LSAN_OPTIONS="verbosity=1" %t 2>&1 | FileCheck %s --check-prefix=CHECK-do
|
||||
// RUN: LSAN_OPTIONS="verbosity=1:leak_check_at_exit=0" ASAN_OPTIONS="$ASAN_OPTIONS:leak_check_at_exit=0" %t foo 2>&1 | FileCheck %s --check-prefix=CHECK-do
|
||||
// RUN: LSAN_OPTIONS="verbosity=1:leak_check_at_exit=0" ASAN_OPTIONS="$ASAN_OPTIONS:leak_check_at_exit=0" %t 2>&1 | FileCheck %s --check-prefix=CHECK-dont
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sanitizer/lsan_interface.h>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
printf("printf to break optimization\n");
|
||||
if (argc > 1)
|
||||
__lsan_do_leak_check();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// CHECK-do: SUMMARY: LeakSanitizer:
|
||||
// CHECK-dont-NOT: SUMMARY: LeakSanitizer:
|
|
@ -31,6 +31,7 @@ static void InitializeCommonFlags() {
|
|||
cf->fast_unwind_on_malloc = true;
|
||||
cf->malloc_context_size = 30;
|
||||
cf->detect_leaks = true;
|
||||
cf->leak_check_at_exit = true;
|
||||
|
||||
ParseCommonFlagsFromString(GetEnv("LSAN_OPTIONS"));
|
||||
}
|
||||
|
@ -59,7 +60,8 @@ void Init() {
|
|||
}
|
||||
|
||||
InitCommonLsan();
|
||||
Atexit(DoLeakCheck);
|
||||
if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit)
|
||||
Atexit(DoLeakCheck);
|
||||
}
|
||||
|
||||
} // namespace __lsan
|
||||
|
|
|
@ -30,6 +30,7 @@ void ParseCommonFlagsFromString(const char *str) {
|
|||
ParseFlag(str, &f->handle_ioctl, "handle_ioctl");
|
||||
ParseFlag(str, &f->log_path, "log_path");
|
||||
ParseFlag(str, &f->detect_leaks, "detect_leaks");
|
||||
ParseFlag(str, &f->leak_check_at_exit, "leak_check_at_exit");
|
||||
}
|
||||
|
||||
static bool GetFlagValue(const char *env, const char *name,
|
||||
|
|
|
@ -41,6 +41,10 @@ struct CommonFlags {
|
|||
const char *log_path;
|
||||
// Enable memory leak detection.
|
||||
bool detect_leaks;
|
||||
// Invoke leak checking in an atexit handler. Has no effect if
|
||||
// detect_leaks=false, or if __lsan_do_leak_check() is called before the
|
||||
// handler has a chance to run.
|
||||
bool leak_check_at_exit;
|
||||
};
|
||||
|
||||
extern CommonFlags common_flags_dont_use_directly;
|
||||
|
|
Loading…
Reference in New Issue