annotate libsanitizer/sanitizer_common/sanitizer_symbolizer_fuchsia.cc @ 144:8f4e72ab4e11

fix segmentation fault caused by nothing next cur_op to end
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 21:23:56 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 //===-- sanitizer_symbolizer_fuchsia.cc -----------------------------------===//
kono
parents:
diff changeset
2 //
kono
parents:
diff changeset
3 // This file is distributed under the University of Illinois Open Source
kono
parents:
diff changeset
4 // License. See LICENSE.TXT for details.
kono
parents:
diff changeset
5 //
kono
parents:
diff changeset
6 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
7 //
kono
parents:
diff changeset
8 // This file is shared between various sanitizers' runtime libraries.
kono
parents:
diff changeset
9 //
kono
parents:
diff changeset
10 // Implementation of Fuchsia-specific symbolizer.
kono
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 #include "sanitizer_platform.h"
kono
parents:
diff changeset
14 #if SANITIZER_FUCHSIA
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 #include "sanitizer_fuchsia.h"
kono
parents:
diff changeset
17 #include "sanitizer_symbolizer.h"
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 namespace __sanitizer {
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 // For Fuchsia we don't do any actual symbolization per se.
kono
parents:
diff changeset
22 // Instead, we emit text containing raw addresses and raw linkage
kono
parents:
diff changeset
23 // symbol names, embedded in Fuchsia's symbolization markup format.
kono
parents:
diff changeset
24 // Fuchsia's logging infrastructure emits enough information about
kono
parents:
diff changeset
25 // process memory layout that a post-processing filter can do the
kono
parents:
diff changeset
26 // symbolization and pretty-print the markup. See the spec at:
kono
parents:
diff changeset
27 // https://fuchsia.googlesource.com/zircon/+/master/docs/symbolizer_markup.md
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 // This is used by UBSan for type names, and by ASan for global variable names.
kono
parents:
diff changeset
30 constexpr const char *kFormatDemangle = "{{{symbol:%s}}}";
kono
parents:
diff changeset
31 constexpr uptr kFormatDemangleMax = 1024; // Arbitrary.
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 // Function name or equivalent from PC location.
kono
parents:
diff changeset
34 constexpr const char *kFormatFunction = "{{{pc:%p}}}";
kono
parents:
diff changeset
35 constexpr uptr kFormatFunctionMax = 64; // More than big enough for 64-bit hex.
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 // Global variable name or equivalent from data memory address.
kono
parents:
diff changeset
38 constexpr const char *kFormatData = "{{{data:%p}}}";
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 // One frame in a backtrace (printed on a line by itself).
kono
parents:
diff changeset
41 constexpr const char *kFormatFrame = "{{{bt:%u:%p}}}";
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 // This is used by UBSan for type names, and by ASan for global variable names.
kono
parents:
diff changeset
44 // It's expected to return a static buffer that will be reused on each call.
kono
parents:
diff changeset
45 const char *Symbolizer::Demangle(const char *name) {
kono
parents:
diff changeset
46 static char buffer[kFormatDemangleMax];
kono
parents:
diff changeset
47 internal_snprintf(buffer, sizeof(buffer), kFormatDemangle, name);
kono
parents:
diff changeset
48 return buffer;
kono
parents:
diff changeset
49 }
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 // This is used mostly for suppression matching. Making it work
kono
parents:
diff changeset
52 // would enable "interceptor_via_lib" suppressions. It's also used
kono
parents:
diff changeset
53 // once in UBSan to say "in module ..." in a message that also
kono
parents:
diff changeset
54 // includes an address in the module, so post-processing can already
kono
parents:
diff changeset
55 // pretty-print that so as to indicate the module.
kono
parents:
diff changeset
56 bool Symbolizer::GetModuleNameAndOffsetForPC(uptr pc, const char **module_name,
kono
parents:
diff changeset
57 uptr *module_address) {
kono
parents:
diff changeset
58 return false;
kono
parents:
diff changeset
59 }
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 // This is used in some places for suppression checking, which we
kono
parents:
diff changeset
62 // don't really support for Fuchsia. It's also used in UBSan to
kono
parents:
diff changeset
63 // identify a PC location to a function name, so we always fill in
kono
parents:
diff changeset
64 // the function member with a string containing markup around the PC
kono
parents:
diff changeset
65 // value.
kono
parents:
diff changeset
66 // TODO(mcgrathr): Under SANITIZER_GO, it's currently used by TSan
kono
parents:
diff changeset
67 // to render stack frames, but that should be changed to use
kono
parents:
diff changeset
68 // RenderStackFrame.
kono
parents:
diff changeset
69 SymbolizedStack *Symbolizer::SymbolizePC(uptr addr) {
kono
parents:
diff changeset
70 SymbolizedStack *s = SymbolizedStack::New(addr);
kono
parents:
diff changeset
71 char buffer[kFormatFunctionMax];
kono
parents:
diff changeset
72 internal_snprintf(buffer, sizeof(buffer), kFormatFunction, addr);
kono
parents:
diff changeset
73 s->info.function = internal_strdup(buffer);
kono
parents:
diff changeset
74 return s;
kono
parents:
diff changeset
75 }
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 // Always claim we succeeded, so that RenderDataInfo will be called.
kono
parents:
diff changeset
78 bool Symbolizer::SymbolizeData(uptr addr, DataInfo *info) {
kono
parents:
diff changeset
79 info->Clear();
kono
parents:
diff changeset
80 info->start = addr;
kono
parents:
diff changeset
81 return true;
kono
parents:
diff changeset
82 }
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 // We ignore the format argument to __sanitizer_symbolize_global.
kono
parents:
diff changeset
85 void RenderData(InternalScopedString *buffer, const char *format,
kono
parents:
diff changeset
86 const DataInfo *DI, const char *strip_path_prefix) {
kono
parents:
diff changeset
87 buffer->append(kFormatData, DI->start);
kono
parents:
diff changeset
88 }
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 // We don't support the stack_trace_format flag at all.
kono
parents:
diff changeset
91 void RenderFrame(InternalScopedString *buffer, const char *format, int frame_no,
kono
parents:
diff changeset
92 const AddressInfo &info, bool vs_style,
kono
parents:
diff changeset
93 const char *strip_path_prefix, const char *strip_func_prefix) {
kono
parents:
diff changeset
94 buffer->append(kFormatFrame, frame_no, info.address);
kono
parents:
diff changeset
95 }
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 Symbolizer *Symbolizer::PlatformInit() {
kono
parents:
diff changeset
98 return new (symbolizer_allocator_) Symbolizer({});
kono
parents:
diff changeset
99 }
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 void Symbolizer::LateInitialize() { Symbolizer::GetOrInit(); }
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 } // namespace __sanitizer
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 #endif // SANITIZER_FUCHSIA