1 //=-- lsan.cc -------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file is a part of LeakSanitizer. 11 // Standalone LSan RTL. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "lsan.h" 16 17 #include "sanitizer_common/sanitizer_flags.h" 18 #include "sanitizer_common/sanitizer_flag_parser.h" 19 #include "sanitizer_common/sanitizer_stacktrace.h" 20 #include "lsan_allocator.h" 21 #include "lsan_common.h" 22 #include "lsan_thread.h" 23 24 bool lsan_inited; 25 bool lsan_init_is_running; 26 27 namespace __lsan { 28 29 ///// Interface to the common LSan module. ///// WordIsPoisoned(uptr addr)30bool WordIsPoisoned(uptr addr) { 31 return false; 32 } 33 34 } // namespace __lsan 35 36 using namespace __lsan; // NOLINT 37 InitializeFlags()38static void InitializeFlags() { 39 // Set all the default values. 40 SetCommonFlagsDefaults(); 41 { 42 CommonFlags cf; 43 cf.CopyFrom(*common_flags()); 44 cf.external_symbolizer_path = GetEnv("LSAN_SYMBOLIZER_PATH"); 45 cf.malloc_context_size = 30; 46 cf.detect_leaks = true; 47 cf.exitcode = 23; 48 OverrideCommonFlags(cf); 49 } 50 51 Flags *f = flags(); 52 f->SetDefaults(); 53 54 FlagParser parser; 55 RegisterLsanFlags(&parser, f); 56 RegisterCommonFlags(&parser); 57 58 parser.ParseString(GetEnv("LSAN_OPTIONS")); 59 60 SetVerbosity(common_flags()->verbosity); 61 62 if (Verbosity()) ReportUnrecognizedFlags(); 63 64 if (common_flags()->help) parser.PrintFlagDescriptions(); 65 } 66 __lsan_init()67extern "C" void __lsan_init() { 68 CHECK(!lsan_init_is_running); 69 if (lsan_inited) 70 return; 71 lsan_init_is_running = true; 72 SanitizerToolName = "LeakSanitizer"; 73 CacheBinaryName(); 74 InitializeFlags(); 75 InitCommonLsan(); 76 InitializeAllocator(); 77 InitTlsSize(); 78 InitializeInterceptors(); 79 InitializeThreadRegistry(); 80 u32 tid = ThreadCreate(0, 0, true); 81 CHECK_EQ(tid, 0); 82 ThreadStart(tid, GetTid()); 83 SetCurrentThread(tid); 84 85 if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit) 86 Atexit(DoLeakCheck); 87 88 InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir); 89 90 lsan_inited = true; 91 lsan_init_is_running = false; 92 } 93 94 extern "C" SANITIZER_INTERFACE_ATTRIBUTE __sanitizer_print_stack_trace()95void __sanitizer_print_stack_trace() { 96 GET_STACK_TRACE_FATAL; 97 stack.Print(); 98 } 99