https://github.com/rniwa updated https://github.com/llvm/llvm-project/pull/137559
>From 9d6c807a5d7b853876132be0668357f6945978af Mon Sep 17 00:00:00 2001 From: Ryosuke Niwa <rn...@webkit.org> Date: Sun, 20 Apr 2025 18:38:31 -0700 Subject: [PATCH 1/2] [RawPtrRefMemberChecker] Make RawPtrRefMemberChecker consistent with other checkers Refactor RawPtrRefMemberChecker so that each subclass override isUnsafePtr like other WebKit checkers instead of overriding isPtrCompatible. --- .../WebKit/RawPtrRefMemberChecker.cpp | 98 +++++++++---------- 1 file changed, 45 insertions(+), 53 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp index 10b9749319a57..209073e3ccc3a 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp @@ -38,9 +38,7 @@ class RawPtrRefMemberChecker RawPtrRefMemberChecker(const char *description) : Bug(this, description, "WebKit coding guidelines") {} - virtual std::optional<bool> - isPtrCompatible(const clang::QualType, - const clang::CXXRecordDecl *R) const = 0; + virtual std::optional<bool> isUnsafePtr(QualType) const = 0; virtual const char *typeName() const = 0; virtual const char *invariant() const = 0; @@ -93,22 +91,30 @@ class RawPtrRefMemberChecker if (!MemberType) continue; - if (auto *MemberCXXRD = MemberType->getPointeeCXXRecordDecl()) { - std::optional<bool> IsCompatible = isPtrCompatible(QT, MemberCXXRD); - if (IsCompatible && *IsCompatible) - reportBug(Member, MemberType, MemberCXXRD, RD); - } else { - std::optional<bool> IsCompatible = isPtrCompatible(QT, nullptr); - auto *PointeeType = MemberType->getPointeeType().getTypePtrOrNull(); - if (IsCompatible && *IsCompatible) { - auto *Desugared = PointeeType->getUnqualifiedDesugaredType(); - if (auto *ObjCType = dyn_cast_or_null<ObjCInterfaceType>(Desugared)) - reportBug(Member, MemberType, ObjCType->getDecl(), RD); - } - } + auto IsUnsafePtr = isUnsafePtr(QT); + if (!IsUnsafePtr || !*IsUnsafePtr) + continue; + + if (auto *MemberCXXRD = MemberType->getPointeeCXXRecordDecl()) + reportBug(Member, MemberType, MemberCXXRD, RD); + else if (auto* ObjCDecl = getObjCDecl(MemberType)) + reportBug(Member, MemberType, ObjCDecl, RD); } } + ObjCInterfaceDecl* getObjCDecl(const Type *TypePtr) const { + auto *PointeeType = TypePtr->getPointeeType().getTypePtrOrNull(); + if (!PointeeType) + return nullptr; + auto *Desugared = PointeeType->getUnqualifiedDesugaredType(); + if (!Desugared) + return nullptr; + auto *ObjCType = dyn_cast<ObjCInterfaceType>(Desugared); + if (!ObjCType) + return nullptr; + return ObjCType->getDecl(); + } + void visitObjCDecl(const ObjCContainerDecl *CD) const { if (BR->getSourceManager().isInSystemHeader(CD->getLocation())) return; @@ -138,19 +144,15 @@ class RawPtrRefMemberChecker const Type *IvarType = QT.getTypePtrOrNull(); if (!IvarType) return; - if (auto *IvarCXXRD = IvarType->getPointeeCXXRecordDecl()) { - std::optional<bool> IsCompatible = isPtrCompatible(QT, IvarCXXRD); - if (IsCompatible && *IsCompatible) - reportBug(Ivar, IvarType, IvarCXXRD, CD); - } else { - std::optional<bool> IsCompatible = isPtrCompatible(QT, nullptr); - auto *PointeeType = IvarType->getPointeeType().getTypePtrOrNull(); - if (IsCompatible && *IsCompatible) { - auto *Desugared = PointeeType->getUnqualifiedDesugaredType(); - if (auto *ObjCType = dyn_cast_or_null<ObjCInterfaceType>(Desugared)) - reportBug(Ivar, IvarType, ObjCType->getDecl(), CD); - } - } + + auto IsUnsafePtr = isUnsafePtr(QT); + if (!IsUnsafePtr || !*IsUnsafePtr) + return; + + if (auto *MemberCXXRD = IvarType->getPointeeCXXRecordDecl()) + reportBug(Ivar, IvarType, MemberCXXRD, CD); + else if (auto* ObjCDecl = getObjCDecl(IvarType)) + reportBug(Ivar, IvarType, ObjCDecl, CD); } void visitObjCPropertyDecl(const ObjCContainerDecl *CD, @@ -161,19 +163,15 @@ class RawPtrRefMemberChecker const Type *PropType = QT.getTypePtrOrNull(); if (!PropType) return; - if (auto *PropCXXRD = PropType->getPointeeCXXRecordDecl()) { - std::optional<bool> IsCompatible = isPtrCompatible(QT, PropCXXRD); - if (IsCompatible && *IsCompatible) - reportBug(PD, PropType, PropCXXRD, CD); - } else { - std::optional<bool> IsCompatible = isPtrCompatible(QT, nullptr); - auto *PointeeType = PropType->getPointeeType().getTypePtrOrNull(); - if (IsCompatible && *IsCompatible) { - auto *Desugared = PointeeType->getUnqualifiedDesugaredType(); - if (auto *ObjCType = dyn_cast_or_null<ObjCInterfaceType>(Desugared)) - reportBug(PD, PropType, ObjCType->getDecl(), CD); - } - } + + auto IsUnsafePtr = isUnsafePtr(QT); + if (!IsUnsafePtr || !*IsUnsafePtr) + return; + + if (auto *MemberCXXRD = PropType->getPointeeCXXRecordDecl()) + reportBug(PD, PropType, MemberCXXRD, CD); + else if (auto* ObjCDecl = getObjCDecl(PropType)) + reportBug(PD, PropType, ObjCDecl, CD); } bool shouldSkipDecl(const RecordDecl *RD) const { @@ -263,10 +261,8 @@ class NoUncountedMemberChecker final : public RawPtrRefMemberChecker { : RawPtrRefMemberChecker("Member variable is a raw-pointer/reference to " "reference-countable type") {} - std::optional<bool> - isPtrCompatible(const clang::QualType, - const clang::CXXRecordDecl *R) const final { - return R ? isRefCountable(R) : std::nullopt; + std::optional<bool> isUnsafePtr(QualType QT) const final { + return isUncountedPtr(QT.getCanonicalType()); } const char *typeName() const final { return "ref-countable type"; } @@ -282,10 +278,8 @@ class NoUncheckedPtrMemberChecker final : public RawPtrRefMemberChecker { : RawPtrRefMemberChecker("Member variable is a raw-pointer/reference to " "checked-pointer capable type") {} - std::optional<bool> - isPtrCompatible(const clang::QualType, - const clang::CXXRecordDecl *R) const final { - return R ? isCheckedPtrCapable(R) : std::nullopt; + std::optional<bool> isUnsafePtr(QualType QT) const final { + return isUncheckedPtr(QT.getCanonicalType()); } const char *typeName() const final { return "CheckedPtr capable type"; } @@ -304,9 +298,7 @@ class NoUnretainedMemberChecker final : public RawPtrRefMemberChecker { RTC = RetainTypeChecker(); } - std::optional<bool> - isPtrCompatible(const clang::QualType QT, - const clang::CXXRecordDecl *) const final { + std::optional<bool> isUnsafePtr(QualType QT) const final { return RTC->isUnretained(QT); } >From b7bdc13bb2ce53d30aff8eac115a3f083d7a36f8 Mon Sep 17 00:00:00 2001 From: Ryosuke Niwa <rn...@webkit.org> Date: Sun, 27 Apr 2025 16:57:22 -0700 Subject: [PATCH 2/2] Fix formatting. --- .../Checkers/WebKit/RawPtrRefMemberChecker.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp index 209073e3ccc3a..e8992f58273bb 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefMemberChecker.cpp @@ -97,12 +97,12 @@ class RawPtrRefMemberChecker if (auto *MemberCXXRD = MemberType->getPointeeCXXRecordDecl()) reportBug(Member, MemberType, MemberCXXRD, RD); - else if (auto* ObjCDecl = getObjCDecl(MemberType)) + else if (auto *ObjCDecl = getObjCDecl(MemberType)) reportBug(Member, MemberType, ObjCDecl, RD); } } - ObjCInterfaceDecl* getObjCDecl(const Type *TypePtr) const { + ObjCInterfaceDecl *getObjCDecl(const Type *TypePtr) const { auto *PointeeType = TypePtr->getPointeeType().getTypePtrOrNull(); if (!PointeeType) return nullptr; @@ -151,7 +151,7 @@ class RawPtrRefMemberChecker if (auto *MemberCXXRD = IvarType->getPointeeCXXRecordDecl()) reportBug(Ivar, IvarType, MemberCXXRD, CD); - else if (auto* ObjCDecl = getObjCDecl(IvarType)) + else if (auto *ObjCDecl = getObjCDecl(IvarType)) reportBug(Ivar, IvarType, ObjCDecl, CD); } @@ -170,7 +170,7 @@ class RawPtrRefMemberChecker if (auto *MemberCXXRD = PropType->getPointeeCXXRecordDecl()) reportBug(PD, PropType, MemberCXXRD, CD); - else if (auto* ObjCDecl = getObjCDecl(PropType)) + else if (auto *ObjCDecl = getObjCDecl(PropType)) reportBug(PD, PropType, ObjCDecl, CD); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits