Skip to content

Commit e873fd1

Browse files
authored
[BOLT] Gadget scanner: do not crash on debug-printing CFI instructions (#136151)
Some instruction-printing code used under LLVM_DEBUG does not handle CFI instructions well. While CFI instructions seem to be harmless for the correctness of the analysis results, they do not convey any useful information to the analysis either, so skip them early.
1 parent 09e794c commit e873fd1

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

bolt/lib/Passes/PAuthGadgetScanner.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,9 @@ class SrcSafetyAnalysis {
430430
}
431431

432432
SrcState computeNext(const MCInst &Point, const SrcState &Cur) {
433+
if (BC.MIB->isCFI(Point))
434+
return Cur;
435+
433436
SrcStatePrinter P(BC);
434437
LLVM_DEBUG({
435438
dbgs() << " SrcSafetyAnalysis::ComputeNext(";
@@ -704,6 +707,8 @@ class CFGUnawareSrcSafetyAnalysis : public SrcSafetyAnalysis,
704707
SrcState S = createEntryState();
705708
for (auto &I : BF.instrs()) {
706709
MCInst &Inst = I.second;
710+
if (BC.MIB->isCFI(Inst))
711+
continue;
707712

708713
// If there is a label before this instruction, it is possible that it
709714
// can be jumped-to, thus conservatively resetting S. As an exception,
@@ -1010,6 +1015,9 @@ class DstSafetyAnalysis {
10101015
}
10111016

10121017
DstState computeNext(const MCInst &Point, const DstState &Cur) {
1018+
if (BC.MIB->isCFI(Point))
1019+
return Cur;
1020+
10131021
DstStatePrinter P(BC);
10141022
LLVM_DEBUG({
10151023
dbgs() << " DstSafetyAnalysis::ComputeNext(";
@@ -1177,6 +1185,8 @@ class CFGUnawareDstSafetyAnalysis : public DstSafetyAnalysis,
11771185
DstState S = createUnsafeState();
11781186
for (auto &I : llvm::reverse(BF.instrs())) {
11791187
MCInst &Inst = I.second;
1188+
if (BC.MIB->isCFI(Inst))
1189+
continue;
11801190

11811191
// If Inst can change the control flow, we cannot be sure that the next
11821192
// instruction (to be executed in analyzed program) is the one processed
@@ -1366,6 +1376,9 @@ void FunctionAnalysisContext::findUnsafeUses(
13661376
});
13671377

13681378
iterateOverInstrs(BF, [&](MCInstReference Inst) {
1379+
if (BC.MIB->isCFI(Inst))
1380+
return;
1381+
13691382
const SrcState &S = Analysis->getStateBefore(Inst);
13701383

13711384
// If non-empty state was never propagated from the entry basic block
@@ -1429,6 +1442,9 @@ void FunctionAnalysisContext::findUnsafeDefs(
14291442
});
14301443

14311444
iterateOverInstrs(BF, [&](MCInstReference Inst) {
1445+
if (BC.MIB->isCFI(Inst))
1446+
return;
1447+
14321448
const DstState &S = Analysis->getStateAfter(Inst);
14331449

14341450
if (auto Report = shouldReportAuthOracle(BC, Inst, S))

bolt/test/binary-analysis/AArch64/gs-pauth-debug-output.s

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,38 @@ auth_oracle:
329329
// PAUTH-EMPTY:
330330
// PAUTH-NEXT: Attaching leakage info to: 00000000: autia x0, x1 # DataflowDstSafetyAnalysis: dst-state<CannotEscapeUnchecked: BitVector, Insts: [0](0x{{[0-9a-f]+}} )>
331331

332+
// Gadget scanner should not crash on CFI instructions, including when debug-printing them.
333+
// Note that the particular debug output is not checked, but BOLT should be
334+
// compiled with assertions enabled to support -debug-only argument.
335+
336+
.globl cfi_inst_df
337+
.type cfi_inst_df,@function
338+
cfi_inst_df:
339+
.cfi_startproc
340+
sub sp, sp, #16
341+
.cfi_def_cfa_offset 16
342+
add sp, sp, #16
343+
.cfi_def_cfa_offset 0
344+
ret
345+
.size cfi_inst_df, .-cfi_inst_df
346+
.cfi_endproc
347+
348+
.globl cfi_inst_nocfg
349+
.type cfi_inst_nocfg,@function
350+
cfi_inst_nocfg:
351+
.cfi_startproc
352+
sub sp, sp, #16
353+
.cfi_def_cfa_offset 16
354+
355+
adr x0, 1f
356+
br x0
357+
1:
358+
add sp, sp, #16
359+
.cfi_def_cfa_offset 0
360+
ret
361+
.size cfi_inst_nocfg, .-cfi_inst_nocfg
362+
.cfi_endproc
363+
332364
// CHECK-LABEL:Analyzing function main, AllocatorId = 1
333365
.globl main
334366
.type main,@function

0 commit comments

Comments
 (0)