xref: /aosp_15_r20/external/compiler-rt/lib/lsan/lsan.cc (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
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 Robot bool 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 Robot static 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 Robot extern "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 Robot void __sanitizer_print_stack_trace() {
98*7c3d14c8STreehugger Robot   GET_STACK_TRACE_FATAL;
99*7c3d14c8STreehugger Robot   stack.Print();
100*7c3d14c8STreehugger Robot }
101