Author: Ryosuke Niwa
Date: 2025-04-04T12:04:20-07:00
New Revision: d8fd665960634bd27bf72f06925314312087a3fe

URL: 
https://github.com/llvm/llvm-project/commit/d8fd665960634bd27bf72f06925314312087a3fe
DIFF: 
https://github.com/llvm/llvm-project/commit/d8fd665960634bd27bf72f06925314312087a3fe.diff

LOG: [alpha.webkit.ForwardDeclChecker] Ignore forward declared struct. (#133804)

There are some system libraries such as sqlite3 which forward declare a
struct then use a pointer to that forward declared type in various APIs.
Ignore these types ForwardDeclChecker like other pointer types.

Added: 
    

Modified: 
    clang/lib/StaticAnalyzer/Checkers/WebKit/ForwardDeclChecker.cpp
    clang/test/Analysis/Checkers/WebKit/forward-decl-checker.mm
    clang/test/Analysis/Checkers/WebKit/mock-system-header.h

Removed: 
    


################################################################################
diff  --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/ForwardDeclChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/ForwardDeclChecker.cpp
index a524593b0119b..2c63224df129a 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/ForwardDeclChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/ForwardDeclChecker.cpp
@@ -108,17 +108,16 @@ class ForwardDeclChecker : public 
Checker<check::ASTDecl<TranslationUnitDecl>> {
     RTC.visitTypedef(TD);
     auto QT = TD->getUnderlyingType().getCanonicalType();
     if (BR->getSourceManager().isInSystemHeader(TD->getBeginLoc())) {
-      if (auto *Type = QT.getTypePtrOrNull(); Type && QT->isPointerType())
+      if (auto *Type = QT.getTypePtrOrNull())
         SystemTypes.insert(Type);
     }
   }
 
   bool isUnknownType(QualType QT) const {
-    auto *Type = QT.getTypePtrOrNull();
-    if (!Type)
-      return false;
     auto *CanonicalType = QT.getCanonicalType().getTypePtrOrNull();
-    auto PointeeQT = Type->getPointeeType();
+    if (!CanonicalType)
+      return false;
+    auto PointeeQT = CanonicalType->getPointeeType();
     auto *PointeeType = PointeeQT.getTypePtrOrNull();
     if (!PointeeType)
       return false;
@@ -128,7 +127,8 @@ class ForwardDeclChecker : public 
Checker<check::ASTDecl<TranslationUnitDecl>> {
     auto Name = R->getName();
     return !R->hasDefinition() && !RTC.isUnretained(QT) &&
            !SystemTypes.contains(CanonicalType) &&
-           !Name.starts_with("Opaque") && Name != "_NSZone";
+           !SystemTypes.contains(PointeeType) && !Name.starts_with("Opaque") &&
+           Name != "_NSZone";
   }
 
   void visitRecordDecl(const RecordDecl *RD, const Decl *DeclWithIssue) const {

diff  --git a/clang/test/Analysis/Checkers/WebKit/forward-decl-checker.mm 
b/clang/test/Analysis/Checkers/WebKit/forward-decl-checker.mm
index 151cbe2affa92..64100d60c4867 100644
--- a/clang/test/Analysis/Checkers/WebKit/forward-decl-checker.mm
+++ b/clang/test/Analysis/Checkers/WebKit/forward-decl-checker.mm
@@ -25,6 +25,8 @@
 
 Obj* provide_obj_ptr();
 void receive_obj_ptr(Obj* p = nullptr);
+sqlite3* open_db();
+void close_db(sqlite3*);
 
 Obj* ptr(Obj* arg) {
   receive_obj_ptr(provide_obj_ptr());
@@ -34,6 +36,8 @@
   receive_obj_ptr(arg);
   receive_obj_ptr(nullptr);
   receive_obj_ptr();
+  auto* db = open_db();
+  close_db(db);
   return obj;
 }
 

diff  --git a/clang/test/Analysis/Checkers/WebKit/mock-system-header.h 
b/clang/test/Analysis/Checkers/WebKit/mock-system-header.h
index 450fb24687343..1e44de8eb62ad 100644
--- a/clang/test/Analysis/Checkers/WebKit/mock-system-header.h
+++ b/clang/test/Analysis/Checkers/WebKit/mock-system-header.h
@@ -16,6 +16,8 @@ struct MemberVariable {
     T* obj { nullptr };
 };
 
+typedef struct sqlite3 sqlite3;
+
 typedef unsigned char uint8_t;
 
 enum os_log_type_t : uint8_t {


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to