[clang] [-Wunsafe-buffer-usage] Add FixableGadget for AddAssign in UnspecifiedUntypedContext (PR #71862)
Ziqing Luo via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 13 14:16:41 PST 2023
================
@@ -1028,6 +1028,50 @@ class UPCPreIncrementGadget : public FixableGadget {
}
};
+// Representing a pointer type expression of the form `Ptr += n` in an
+// Unspecified Untyped Context (UUC):
+class UUCAddAssignGadget : public FixableGadget {
+private:
+ static constexpr const char *const UUCAddAssignTag =
+ "PointerAddAssignUnderUUC";
+ static constexpr const char *const IntOffsetTag = "IntOffset";
+ static constexpr const char *const OffsetTag = "Offset";
+
+ const BinaryOperator *Node; // the `Ptr += n` node
+ const IntegerLiteral *IntOffset = nullptr;
+ const DeclRefExpr *Offset = nullptr;
+
+public:
+ UUCAddAssignGadget(const MatchFinder::MatchResult &Result)
+ : FixableGadget(Kind::UUCAddAssign),
+ Node(Result.Nodes.getNodeAs<BinaryOperator>(UUCAddAssignTag)),
+ IntOffset(Result.Nodes.getNodeAs<IntegerLiteral>(IntOffsetTag)),
+ Offset(Result.Nodes.getNodeAs<DeclRefExpr>(OffsetTag)) {
+ assert(Node != nullptr && "Expecting a non-null matching result");
+ }
+
+ static bool classof(const Gadget *G) {
+ return G->getKind() == Kind::UUCAddAssign;
+ }
+
+ static Matcher matcher() {
+ return stmt(isInUnspecifiedUntypedContext(expr(ignoringImpCasts(
+ binaryOperator(
+ hasOperatorName("+="), hasLHS(declRefExpr(toSupportedVariable())),
+ hasRHS(expr(anyOf(ignoringImpCasts(declRefExpr().bind(OffsetTag)),
+ integerLiteral().bind(IntOffsetTag)))))
----------------
ziqingluo-90 wrote:
For RHS, if it is not a constant, all we need to know about it is whether it is an unsigned integer. It doesn't have to be a DRE, e.g., `p += (x + 1)` can be transformed to `p = p.subspan(x + 1)` as long as `(x + 1)` has unsigned integer type.
https://github.com/llvm/llvm-project/pull/71862
More information about the cfe-commits
mailing list