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