Skip to content

Commit 0d4f8a3

Browse files
Georgii Rymartstellar
authored andcommitted
[llvm-symbolizer] - Fix the crash in GNU output style with --no-inlines and missing input file.
Fixes https://bugs.llvm.org/show_bug.cgi?id=48882. If the input file does not exist (or has a reading error), the following code will crash if there are two or more input addresses. ``` auto ResOrErr = Symbolizer.symbolizeInlinedCode( ModuleName, {Offset, object::SectionedAddress::UndefSection}); Printer << (error(ResOrErr) ? DILineInfo() : ResOrErr.get().getFrame(0)); ``` For the first address, `symbolizeInlinedCode` returns an error. For the second address, `symbolizeInlinedCode` returns an empty result (not an error) and `.getFrame(0)` will crash. Differential revision: https://reviews.llvm.org/D95609 (cherry picked from commit d221406)
1 parent b1106a5 commit 0d4f8a3

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

llvm/test/tools/llvm-symbolizer/output-style-inlined.test

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,24 @@ RUN: | FileCheck %s --check-prefix=LLVM --implicit-check-not=inctwo
2828

2929
LLVM: main
3030
GNU: inctwo
31+
32+
## Check that we are able to produce an output properly when the --no-inlines option
33+
## is specified, but a file doesn't exist. Check we report an error.
34+
35+
RUN: llvm-symbolizer --output-style=GNU --obj=%p/Inputs/not.exist 0x1 0x2 --no-inlines 2>&1 \
36+
RUN: | FileCheck %s --check-prefix=NOT-EXIST-GNU -DMSG=%errc_ENOENT
37+
RUN: llvm-symbolizer --output-style=LLVM --obj=%p/Inputs/not.exist 0x1 0x2 --no-inlines 2>&1 \
38+
RUN: | FileCheck %s --check-prefix=NOT-EXIST-LLVM -DMSG=%errc_ENOENT
39+
40+
# NOT-EXIST-GNU: LLVMSymbolizer: error reading file: [[MSG]]
41+
# NOT-EXIST-GNU-NEXT: ??
42+
# NOT-EXIST-GNU-NEXT: ??:0
43+
# NOT-EXIST-GNU-NEXT: ??
44+
# NOT-EXIST-GNU-NEXT: ??:0
45+
46+
# NOT-EXIST-LLVM: LLVMSymbolizer: error reading file: [[MSG]]
47+
# NOT-EXIST-LLVM-NEXT: ??
48+
# NOT-EXIST-LLVM-NEXT: ??:0:0
49+
# NOT-EXIST-LLVM-EMPTY:
50+
# NOT-EXIST-LLVM-NEXT: ??
51+
# NOT-EXIST-LLVM-NEXT: ??:0:0

llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,12 @@ static void symbolizeInput(const opt::InputArgList &Args, uint64_t AdjustVMA,
181181
// the topmost function, which suits our needs better.
182182
auto ResOrErr = Symbolizer.symbolizeInlinedCode(
183183
ModuleName, {Offset, object::SectionedAddress::UndefSection});
184-
Printer << (error(ResOrErr) ? DILineInfo() : ResOrErr.get().getFrame(0));
184+
if (!ResOrErr || ResOrErr->getNumberOfFrames() == 0) {
185+
error(ResOrErr);
186+
Printer << DILineInfo();
187+
} else {
188+
Printer << ResOrErr->getFrame(0);
189+
}
185190
} else {
186191
auto ResOrErr = Symbolizer.symbolizeCode(
187192
ModuleName, {Offset, object::SectionedAddress::UndefSection});

0 commit comments

Comments
 (0)