[clang] [Clang] Optimize -Wunsafe-buffer-usage. (PR #125492)
Ilya Biryukov via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 27 03:52:05 PST 2025
================
@@ -1505,23 +1741,51 @@ class DataInvocationGadget : public WarningGadget {
const ExplicitCastExpr *Op;
public:
- DataInvocationGadget(const MatchFinder::MatchResult &Result)
+ DataInvocationGadget(const MatchResult &Result)
: WarningGadget(Kind::DataInvocation),
- Op(Result.Nodes.getNodeAs<ExplicitCastExpr>(OpTag)) {}
+ Op(Result.getNodeAs<ExplicitCastExpr>(OpTag)) {}
static bool classof(const Gadget *G) {
return G->getKind() == Kind::DataInvocation;
}
- static Matcher matcher() {
+ static bool checkCallExpr(const CXXMemberCallExpr *call) {
+ if (!call)
+ return false;
+ auto *callee = call->getDirectCallee();
+ if (!callee || !isa<CXXMethodDecl>(callee))
+ return false;
+ auto *method = cast<CXXMethodDecl>(callee);
+ if (method->getNameAsString() == "data" &&
+ (method->getParent()->getQualifiedNameAsString() == "std::span" ||
+ method->getParent()->getQualifiedNameAsString() == "std::array" ||
+ method->getParent()->getQualifiedNameAsString() == "std::vector"))
+ return true;
+ return false;
+ }
- Matcher callExpr = cxxMemberCallExpr(callee(
- cxxMethodDecl(hasName("data"),
- ofClass(anyOf(hasName("std::span"), hasName("std::array"),
- hasName("std::vector"))))));
- return stmt(
- explicitCastExpr(anyOf(has(callExpr), has(parenExpr(has(callExpr)))))
- .bind(OpTag));
+ static bool matches(const Stmt *S, const ASTContext &Ctx,
+ MatchResult &Result) {
+ auto *CE = dyn_cast<ExplicitCastExpr>(S);
+ if (!CE)
+ return false;
+ for (auto *child : CE->children()) {
----------------
ilya-biryukov wrote:
NIT: Use `Child` per LLVM's naming.
https://github.com/llvm/llvm-project/pull/125492
More information about the cfe-commits
mailing list