[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