@@ -380,6 +380,10 @@ class FixableGadget : public Gadget {
380
380
}
381
381
};
382
382
383
+ static auto toSupportedVariable () {
384
+ return to (varDecl ());
385
+ }
386
+
383
387
using FixableGadgetList = std::vector<std::unique_ptr<FixableGadget>>;
384
388
using WarningGadgetList = std::vector<std::unique_ptr<WarningGadget>>;
385
389
@@ -566,7 +570,8 @@ class PointerInitGadget : public FixableGadget {
566
570
static Matcher matcher () {
567
571
auto PtrInitStmt = declStmt (hasSingleDecl (varDecl (
568
572
hasInitializer (ignoringImpCasts (declRefExpr (
569
- hasPointerType ()).
573
+ hasPointerType (),
574
+ toSupportedVariable ()).
570
575
bind (PointerInitRHSTag)))).
571
576
bind (PointerInitLHSTag)));
572
577
@@ -616,10 +621,10 @@ class PointerAssignmentGadget : public FixableGadget {
616
621
static Matcher matcher () {
617
622
auto PtrAssignExpr = binaryOperator (allOf (hasOperatorName (" =" ),
618
623
hasRHS (ignoringParenImpCasts (declRefExpr (hasPointerType (),
619
- to ( varDecl () )).
624
+ toSupportedVariable ( )).
620
625
bind (PointerAssignRHSTag))),
621
626
hasLHS (declRefExpr (hasPointerType (),
622
- to ( varDecl () )).
627
+ toSupportedVariable ( )).
623
628
bind (PointerAssignLHSTag))));
624
629
625
630
return stmt (isInUnspecifiedUntypedContext (PtrAssignExpr));
@@ -691,7 +696,8 @@ class ULCArraySubscriptGadget : public FixableGadget {
691
696
static Matcher matcher () {
692
697
auto ArrayOrPtr = anyOf (hasPointerType (), hasArrayType ());
693
698
auto BaseIsArrayOrPtrDRE =
694
- hasBase (ignoringParenImpCasts (declRefExpr (ArrayOrPtr)));
699
+ hasBase (ignoringParenImpCasts (declRefExpr (ArrayOrPtr,
700
+ toSupportedVariable ())));
695
701
auto Target =
696
702
arraySubscriptExpr (BaseIsArrayOrPtrDRE).bind (ULCArraySubscriptTag);
697
703
@@ -733,7 +739,8 @@ class UPCStandalonePointerGadget : public FixableGadget {
733
739
static Matcher matcher () {
734
740
auto ArrayOrPtr = anyOf (hasPointerType (), hasArrayType ());
735
741
auto target = expr (
736
- ignoringParenImpCasts (declRefExpr (allOf (ArrayOrPtr, to (varDecl ()))).bind (DeclRefExprTag)));
742
+ ignoringParenImpCasts (declRefExpr (allOf (ArrayOrPtr,
743
+ toSupportedVariable ())).bind (DeclRefExprTag)));
737
744
return stmt (isInUnspecifiedPointerContext (target));
738
745
}
739
746
@@ -769,7 +776,7 @@ class PointerDereferenceGadget : public FixableGadget {
769
776
unaryOperator (
770
777
hasOperatorName (" *" ),
771
778
has (expr (ignoringParenImpCasts (
772
- declRefExpr (to ( varDecl () )).bind (BaseDeclRefExprTag)))))
779
+ declRefExpr (toSupportedVariable ( )).bind (BaseDeclRefExprTag)))))
773
780
.bind (OperatorTag);
774
781
775
782
return expr (isInUnspecifiedLvalueContext (Target));
@@ -809,7 +816,8 @@ class UPCAddressofArraySubscriptGadget : public FixableGadget {
809
816
return expr (isInUnspecifiedPointerContext (expr (ignoringImpCasts (
810
817
unaryOperator (hasOperatorName (" &" ),
811
818
hasUnaryOperand (arraySubscriptExpr (
812
- hasBase (ignoringParenImpCasts (declRefExpr ())))))
819
+ hasBase (ignoringParenImpCasts (declRefExpr (
820
+ toSupportedVariable ()))))))
813
821
.bind (UPCAddressofArraySubscriptTag)))));
814
822
}
815
823
@@ -961,7 +969,8 @@ class UPCPreIncrementGadget : public FixableGadget {
961
969
// things right.
962
970
return stmt (isInUnspecifiedPointerContext (expr (ignoringImpCasts (
963
971
unaryOperator (isPreInc (),
964
- hasUnaryOperand (declRefExpr ())
972
+ hasUnaryOperand (declRefExpr (
973
+ toSupportedVariable ()))
965
974
).bind (UPCPreIncrementTag)))));
966
975
}
967
976
@@ -999,7 +1008,8 @@ class DerefSimplePtrArithFixableGadget : public FixableGadget {
999
1008
static Matcher matcher () {
1000
1009
// clang-format off
1001
1010
auto ThePtr = expr (hasPointerType (),
1002
- ignoringImpCasts (declRefExpr (to (varDecl ())).bind (BaseDeclRefExprTag)));
1011
+ ignoringImpCasts (declRefExpr (toSupportedVariable ()).
1012
+ bind (BaseDeclRefExprTag)));
1003
1013
auto PlusOverPtrAndInteger = expr (anyOf (
1004
1014
binaryOperator (hasOperatorName (" +" ), hasLHS (ThePtr),
1005
1015
hasRHS (integerLiteral ().bind (OffsetTag)))
@@ -1106,7 +1116,7 @@ findGadgets(const Decl *D, const UnsafeBufferUsageHandler &Handler,
1106
1116
// In parallel, match all DeclRefExprs so that to find out
1107
1117
// whether there are any uncovered by gadgets.
1108
1118
declRefExpr (anyOf (hasPointerType (), hasArrayType ()),
1109
- to (varDecl ())).bind (" any_dre" ),
1119
+ to (anyOf ( varDecl (), bindingDecl () ))).bind (" any_dre" ),
1110
1120
// Also match DeclStmts because we'll need them when fixing
1111
1121
// their underlying VarDecls that otherwise don't have
1112
1122
// any backreferences to DeclStmts.
0 commit comments