• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_stacktrace.h"
19 #include "lsan_allocator.h"
20 #include "lsan_common.h"
21 #include "lsan_thread.h"
22 
23 namespace __lsan {
24 
InitializeCommonFlags()25 static void InitializeCommonFlags() {
26   CommonFlags *cf = common_flags();
27   cf->external_symbolizer_path = GetEnv("LSAN_SYMBOLIZER_PATH");
28   cf->symbolize = (cf->external_symbolizer_path &&
29       cf->external_symbolizer_path[0]);
30   cf->strip_path_prefix = "";
31   cf->fast_unwind_on_malloc = true;
32   cf->malloc_context_size = 30;
33   cf->detect_leaks = true;
34   cf->leak_check_at_exit = true;
35 
36   ParseCommonFlagsFromString(GetEnv("LSAN_OPTIONS"));
37 }
38 
Init()39 void Init() {
40   static bool inited;
41   if (inited)
42     return;
43   inited = true;
44   SanitizerToolName = "LeakSanitizer";
45   InitializeCommonFlags();
46   InitializeAllocator();
47   InitTlsSize();
48   InitializeInterceptors();
49   InitializeThreadRegistry();
50   u32 tid = ThreadCreate(0, 0, true);
51   CHECK_EQ(tid, 0);
52   ThreadStart(tid, GetTid());
53   SetCurrentThread(tid);
54 
55   // Start symbolizer process if necessary.
56   const char* external_symbolizer = common_flags()->external_symbolizer_path;
57   if (common_flags()->symbolize && external_symbolizer &&
58       external_symbolizer[0]) {
59     InitializeExternalSymbolizer(external_symbolizer);
60   }
61 
62   InitCommonLsan();
63   if (common_flags()->detect_leaks && common_flags()->leak_check_at_exit)
64     Atexit(DoLeakCheck);
65 }
66 
67 }  // namespace __lsan
68