[clang] [Clang] Optimize -Wunsafe-buffer-usage. (PR #125492)
Ilya Biryukov via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 27 03:52:09 PST 2025
================
@@ -1901,28 +2238,37 @@ class UUCAddAssignGadget : public FixableGadget {
const Expr *Offset = nullptr;
public:
- UUCAddAssignGadget(const MatchFinder::MatchResult &Result)
+ UUCAddAssignGadget(const MatchResult &Result)
: FixableGadget(Kind::UUCAddAssign),
- Node(Result.Nodes.getNodeAs<BinaryOperator>(UUCAddAssignTag)),
- Offset(Result.Nodes.getNodeAs<Expr>(OffsetTag)) {
+ Node(Result.getNodeAs<BinaryOperator>(UUCAddAssignTag)),
+ Offset(Result.getNodeAs<Expr>(OffsetTag)) {
assert(Node != nullptr && "Expecting a non-null matching result");
}
static bool classof(const Gadget *G) {
return G->getKind() == Kind::UUCAddAssign;
}
- static Matcher matcher() {
- // clang-format off
- return stmt(isInUnspecifiedUntypedContext(expr(ignoringImpCasts(
- binaryOperator(hasOperatorName("+="),
- hasLHS(
- declRefExpr(
- hasPointerType(),
- toSupportedVariable())),
- hasRHS(expr().bind(OffsetTag)))
- .bind(UUCAddAssignTag)))));
- // clang-format on
+ static bool matches(const Stmt *S, llvm::SmallVector<MatchResult> &Results) {
+ bool Found = false;
+ findStmtsInUnspecifiedUntypedContext(S, [&Found, &Results](const Stmt *S) {
+ const auto *E = dyn_cast<Expr>(S);
+ if (!E)
+ return;
+ const auto *BO = dyn_cast<BinaryOperator>(E->IgnoreImpCasts());
+ if (!BO || BO->getOpcode() != BO_AddAssign)
+ return;
+ const auto *DRE = dyn_cast<DeclRefExpr>(BO->getLHS());
+ if (!DRE || !hasPointerType(*DRE) || !isSupportedVariable(*DRE) ||
+ !isa<Expr>(BO->getRHS()))
----------------
ilya-biryukov wrote:
`RHS` is always an expression, so this check is redundant. Just remove it.
https://github.com/llvm/llvm-project/pull/125492
More information about the cfe-commits
mailing list