@@ -367,17 +367,15 @@ class SrcSafetyAnalysis {
367
367
SmallVector<MCPhysReg> getRegsMadeSafeToDeref (const MCInst &Point,
368
368
const SrcState &Cur) const {
369
369
SmallVector<MCPhysReg> Regs;
370
- const MCPhysReg NoReg = BC.MIB ->getNoRegister ();
371
370
372
371
// A signed pointer can be authenticated, or
373
- ErrorOr<MCPhysReg> AutReg = BC. MIB -> getAuthenticatedReg (Point) ;
374
- if (AutReg && * AutReg != NoReg )
372
+ bool Dummy = false ;
373
+ if (auto AutReg = BC. MIB -> getWrittenAuthenticatedReg (Point, Dummy) )
375
374
Regs.push_back (*AutReg);
376
375
377
376
// ... a safe address can be materialized, or
378
- MCPhysReg NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point);
379
- if (NewAddrReg != NoReg)
380
- Regs.push_back (NewAddrReg);
377
+ if (auto NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point))
378
+ Regs.push_back (*NewAddrReg);
381
379
382
380
// ... an address can be updated in a safe manner, producing the result
383
381
// which is as trusted as the input address.
@@ -393,13 +391,20 @@ class SrcSafetyAnalysis {
393
391
SmallVector<MCPhysReg> getRegsMadeTrusted (const MCInst &Point,
394
392
const SrcState &Cur) const {
395
393
SmallVector<MCPhysReg> Regs;
396
- const MCPhysReg NoReg = BC.MIB ->getNoRegister ();
397
394
398
395
// An authenticated pointer can be checked, or
399
- MCPhysReg CheckedReg =
396
+ std::optional< MCPhysReg> CheckedReg =
400
397
BC.MIB ->getAuthCheckedReg (Point, /* MayOverwrite=*/ false );
401
- if (CheckedReg != NoReg && Cur.SafeToDerefRegs [CheckedReg])
402
- Regs.push_back (CheckedReg);
398
+ if (CheckedReg && Cur.SafeToDerefRegs [*CheckedReg])
399
+ Regs.push_back (*CheckedReg);
400
+
401
+ // ... a pointer can be authenticated by an instruction that always checks
402
+ // the pointer, or
403
+ bool IsChecked = false ;
404
+ std::optional<MCPhysReg> AutReg =
405
+ BC.MIB ->getWrittenAuthenticatedReg (Point, IsChecked);
406
+ if (AutReg && IsChecked)
407
+ Regs.push_back (*AutReg);
403
408
404
409
if (CheckerSequenceInfo.contains (&Point)) {
405
410
MCPhysReg CheckedReg;
@@ -414,9 +419,8 @@ class SrcSafetyAnalysis {
414
419
}
415
420
416
421
// ... a safe address can be materialized, or
417
- MCPhysReg NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point);
418
- if (NewAddrReg != NoReg)
419
- Regs.push_back (NewAddrReg);
422
+ if (auto NewAddrReg = BC.MIB ->getMaterializedAddressRegForPtrAuth (Point))
423
+ Regs.push_back (*NewAddrReg);
420
424
421
425
// ... an address can be updated in a safe manner, producing the result
422
426
// which is as trusted as the input address.
@@ -733,25 +737,28 @@ shouldReportReturnGadget(const BinaryContext &BC, const MCInstReference &Inst,
733
737
if (!BC.MIB ->isReturn (Inst))
734
738
return std::nullopt;
735
739
736
- ErrorOr<MCPhysReg> MaybeRetReg = BC.MIB ->getRegUsedAsRetDest (Inst);
737
- if (MaybeRetReg.getError ()) {
740
+ bool IsAuthenticated = false ;
741
+ std::optional<MCPhysReg> RetReg =
742
+ BC.MIB ->getRegUsedAsRetDest (Inst, IsAuthenticated);
743
+ if (!RetReg) {
738
744
return make_generic_report (
739
745
Inst, " Warning: pac-ret analysis could not analyze this return "
740
746
" instruction" );
741
747
}
742
- MCPhysReg RetReg = *MaybeRetReg;
748
+ if (IsAuthenticated)
749
+ return std::nullopt;
750
+
751
+ assert (*RetReg != BC.MIB ->getNoRegister ());
743
752
LLVM_DEBUG ({
744
753
traceInst (BC, " Found RET inst" , Inst);
745
- traceReg (BC, " RetReg" , RetReg);
746
- traceReg (BC, " Authenticated reg " , BC. MIB -> getAuthenticatedReg (Inst) );
754
+ traceReg (BC, " RetReg" , * RetReg);
755
+ traceRegMask (BC, " SafeToDerefRegs " , S. SafeToDerefRegs );
747
756
});
748
- if (BC.MIB ->isAuthenticationOfReg (Inst, RetReg))
749
- return std::nullopt;
750
- LLVM_DEBUG ({ traceRegMask (BC, " SafeToDerefRegs" , S.SafeToDerefRegs ); });
751
- if (S.SafeToDerefRegs [RetReg])
757
+
758
+ if (S.SafeToDerefRegs [*RetReg])
752
759
return std::nullopt;
753
760
754
- return make_report (RetKind, Inst, RetReg);
761
+ return make_report (RetKind, Inst, * RetReg);
755
762
}
756
763
757
764
static std::optional<BriefReport<MCPhysReg>>
@@ -784,19 +791,20 @@ shouldReportSigningOracle(const BinaryContext &BC, const MCInstReference &Inst,
784
791
const SrcState &S) {
785
792
static const GadgetKind SigningOracleKind (" signing oracle found" );
786
793
787
- MCPhysReg SignedReg = BC.MIB ->getSignedReg (Inst);
788
- if (SignedReg == BC. MIB -> getNoRegister () )
794
+ std::optional< MCPhysReg> SignedReg = BC.MIB ->getSignedReg (Inst);
795
+ if (! SignedReg)
789
796
return std::nullopt;
790
797
798
+ assert (*SignedReg != BC.MIB ->getNoRegister ());
791
799
LLVM_DEBUG ({
792
800
traceInst (BC, " Found sign inst" , Inst);
793
- traceReg (BC, " Signed reg" , SignedReg);
801
+ traceReg (BC, " Signed reg" , * SignedReg);
794
802
traceRegMask (BC, " TrustedRegs" , S.TrustedRegs );
795
803
});
796
- if (S.TrustedRegs [SignedReg])
804
+ if (S.TrustedRegs [* SignedReg])
797
805
return std::nullopt;
798
806
799
- return make_report (SigningOracleKind, Inst, SignedReg);
807
+ return make_report (SigningOracleKind, Inst, * SignedReg);
800
808
}
801
809
802
810
template <typename T> static void iterateOverInstrs (BinaryFunction &BF, T Fn) {
0 commit comments