Home | History | Annotate | Download | only in lsan
      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. /////
     30 bool WordIsPoisoned(uptr addr) {
     31   return false;
     32 }
     33 
     34 }  // namespace __lsan
     35 
     36 using namespace __lsan;  // NOLINT
     37 
     38 static 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 
     67 extern "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
     95 void __sanitizer_print_stack_trace() {
     96   GET_STACK_TRACE_FATAL;
     97   stack.Print();
     98 }
     99