@@ -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.
@@ -731,25 +735,28 @@ shouldReportReturnGadget(const BinaryContext &BC, const MCInstReference &Inst,
731
735
if (!BC.MIB ->isReturn (Inst))
732
736
return std::nullopt;
733
737
734
- ErrorOr<MCPhysReg> MaybeRetReg = BC.MIB ->getRegUsedAsRetDest (Inst);
735
- if (MaybeRetReg.getError ()) {
738
+ bool IsAuthenticated = false ;
739
+ std::optional<MCPhysReg> RetReg =
740
+ BC.MIB ->getRegUsedAsRetDest (Inst, IsAuthenticated);
741
+ if (!RetReg) {
736
742
return make_generic_report (
737
743
Inst, " Warning: pac-ret analysis could not analyze this return "
738
744
" instruction" );
739
745
}
740
- MCPhysReg RetReg = *MaybeRetReg;
746
+ if (IsAuthenticated)
747
+ return std::nullopt;
748
+
749
+ assert (*RetReg != BC.MIB ->getNoRegister ());
741
750
LLVM_DEBUG ({
742
751
traceInst (BC, " Found RET inst" , Inst);
743
- traceReg (BC, " RetReg" , RetReg);
744
- traceReg (BC, " Authenticated reg " , BC. MIB -> getAuthenticatedReg (Inst) );
752
+ traceReg (BC, " RetReg" , * RetReg);
753
+ traceRegMask (BC, " SafeToDerefRegs " , S. SafeToDerefRegs );
745
754
});
746
- if (BC.MIB ->isAuthenticationOfReg (Inst, RetReg))
747
- return std::nullopt;
748
- LLVM_DEBUG ({ traceRegMask (BC, " SafeToDerefRegs" , S.SafeToDerefRegs ); });
749
- if (S.SafeToDerefRegs [RetReg])
755
+
756
+ if (S.SafeToDerefRegs [*RetReg])
750
757
return std::nullopt;
751
758
752
- return make_report (RetKind, Inst, RetReg);
759
+ return make_report (RetKind, Inst, * RetReg);
753
760
}
754
761
755
762
static std::optional<BriefReport<MCPhysReg>>
@@ -782,19 +789,20 @@ shouldReportSigningOracle(const BinaryContext &BC, const MCInstReference &Inst,
782
789
const SrcState &S) {
783
790
static const GadgetKind SigningOracleKind (" signing oracle found" );
784
791
785
- MCPhysReg SignedReg = BC.MIB ->getSignedReg (Inst);
786
- if (SignedReg == BC. MIB -> getNoRegister () )
792
+ std::optional< MCPhysReg> SignedReg = BC.MIB ->getSignedReg (Inst);
793
+ if (! SignedReg)
787
794
return std::nullopt;
788
795
796
+ assert (*SignedReg != BC.MIB ->getNoRegister ());
789
797
LLVM_DEBUG ({
790
798
traceInst (BC, " Found sign inst" , Inst);
791
- traceReg (BC, " Signed reg" , SignedReg);
799
+ traceReg (BC, " Signed reg" , * SignedReg);
792
800
traceRegMask (BC, " TrustedRegs" , S.TrustedRegs );
793
801
});
794
- if (S.TrustedRegs [SignedReg])
802
+ if (S.TrustedRegs [* SignedReg])
795
803
return std::nullopt;
796
804
797
- return make_report (SigningOracleKind, Inst, SignedReg);
805
+ return make_report (SigningOracleKind, Inst, * SignedReg);
798
806
}
799
807
800
808
template <typename T> static void iterateOverInstrs (BinaryFunction &BF, T Fn) {
0 commit comments