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