Skip to content

Merge Webkit checker fixes #10219

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 42 commits into
base: stable/20240723
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
2cd9739
[alpha.webkit.UnretainedLocalVarsChecker] Add a checker for local var…
rniwa Feb 24, 2025
2570f73
[analyzer] Handle structured bindings in alpha.webkit.UncountedCallAr…
ojhunt Mar 3, 2025
e31b229
[alpha.webkit.UncountedCallArgsChecker] Recognize CXXUnresolvedConstr…
rniwa Mar 7, 2025
7314aa9
[alpha.webkit.UnretainedLambdaCapturesChecker] Add a WebKit checker f…
rniwa Mar 9, 2025
3985c3f
[alpha.webkit.NoUnretainedMemberChecker] Add a new WebKit checker for…
rniwa Mar 10, 2025
a322a7e
[WebKit checkers] Don't treat virtual functions as safe. (#129632)
rniwa Mar 11, 2025
d3dbb05
[webkit.UncountedLambdaCapturesChecker] Recognize std::move(protected…
rniwa Mar 12, 2025
b30d426
Add unretained call args checker (#130901)
rniwa Mar 12, 2025
28c78ae
[alpha.webkit.UncountedCallArgsChecker] Treat an explicit constructio…
rniwa Mar 13, 2025
2fae802
[alpha.webkit.webkit.RetainPtrCtorAdoptChecker] Add a new WebKit chec…
rniwa Mar 13, 2025
63ddb4a
[alpha.webkit.ForwardDeclChecker] Add a new WebKit checker for forwar…
rniwa Mar 13, 2025
fd04eee
[alpha.webkit.UncountedCallArgsChecker] os_log functions should be tr…
rniwa Mar 18, 2025
2a385be
[webkit.NoUncountedMemberChecker] Fix a regression that every class i…
rniwa Mar 18, 2025
50ad6fb
[webkit.RefCntblBaseVirtualDtor] Add support for NoVirtualDestructorB…
rniwa Mar 26, 2025
41ffb47
[WebKit Checkers] Recognize Objective-C and CF pointer conversion fun…
rniwa Mar 27, 2025
1069648
Fix the assertion failure in Analysis/Checkers/WebKit/forward-decl-ch…
rniwa Mar 27, 2025
dc2a681
[alpha.webkit.RawPtrRefMemberChecker] The checker doesn't warn Object…
rniwa Mar 29, 2025
ea79d25
[alpha.webkit.NoUnretainedMemberChecker] Ignore system-header-defined…
rniwa Mar 31, 2025
fd32611
[WebKit checkers] Treat Objective-C message send return value as safe…
rniwa Apr 4, 2025
e250d22
[alpha.webkit.ForwardDeclChecker] Ignore forward declared struct. (#1…
rniwa Apr 4, 2025
fcfed41
[alpha.webkit.RetainPtrCtorAdoptChecker] Recognize mutableCopy from l…
rniwa Apr 9, 2025
81d9f2f
[alpha.webkit.UnretainedLambdaCapturesChecker] Add the support for pr…
rniwa Apr 9, 2025
9ecfa43
[alpha.webkit.RetainPtrCtorAdoptChecker] Support adopt(cast(copy(~)) …
rniwa Apr 10, 2025
0e333cb
[alpha.webkit.ForwardDeclChecker] Recognize a forward declared templa…
rniwa Apr 10, 2025
abc6a12
Remove the redundant check for "WeakPtr" in isSmartPtrClass to fix th…
rniwa Apr 14, 2025
03c2480
[alpha.webkit.UnretainedCallArgsChecker] Don't emit a warning for Ret…
rniwa Apr 14, 2025
e0eb5fd
[alpha.webkit.UnretainedCallArgsChecker] Add the support for RetainPt…
rniwa Apr 16, 2025
3803f3b
[WebKit checkers] Treat global const variables as safe (#136170)
rniwa Apr 22, 2025
daeb3ec
[RawPtrRefMemberChecker] Member variable checker should allow T* in s…
rniwa Apr 23, 2025
5611587
[alpha.webkit.UncheckedCallArgsChecker] Checker fails to recognize Ca…
rniwa Apr 24, 2025
41f92b6
[webkit.UncountedLambdaCapturesChecker] Treat a call to lambda functi…
rniwa Apr 25, 2025
04ec1fb
[alpha.webkit.RetainPtrCtorAdoptChecker] An assortment of small enhan…
rniwa Apr 27, 2025
e8e99e6
[alpha.webkit.RetainPtrCtorAdoptChecker] Check nullity before calling…
rniwa Apr 27, 2025
a8a2a22
[RawPtrRefMemberChecker] Make RawPtrRefMemberChecker consistent with …
rniwa Apr 30, 2025
e76e829
[WebKit checkers] Treat std::bit_cast as a pointer conversion (#137476)
rniwa May 1, 2025
d236bc8
[webkit.UncountedLambdaCapturesChecker] Treat a copy capture of a Che…
rniwa May 7, 2025
bef9d8b
[RawPtrRefMemberChecker] Add the support for union and pointers to un…
rniwa May 10, 2025
73fdce8
[webkit.UncountedLambdaCapturesChecker] Treat every argument of std::…
rniwa May 10, 2025
98829b6
[alpha.webkit.UncheckedCallArgsChecker] Forwarding r-value reference …
rniwa Jun 6, 2025
4121fde
[WebKit checkers] Treat passing of a member variable which is capable…
rniwa Jun 9, 2025
1751397
[WebKit checkers] Add an annotation for pointer conversion. (#141277)
rniwa Jun 9, 2025
0a39858
[alpha.webkit.NoUnretainedMemberChecker] Recognize NS_REQUIRES_PROPER…
rniwa Jun 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
[RawPtrRefMemberChecker] Make RawPtrRefMemberChecker consistent with …
…other checkers (llvm#137559)

Refactor RawPtrRefMemberChecker so that each subclass override
isUnsafePtr like other WebKit checkers instead of overriding
isPtrCompatible.
  • Loading branch information
rniwa committed May 1, 2025
commit a8a2a227d579fcd9c0c88e134af3e9dda95f4f7a
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -94,22 +92,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;
Expand Down Expand Up @@ -139,19 +145,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,
Expand All @@ -162,19 +164,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 {
Expand Down Expand Up @@ -264,10 +262,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"; }
Expand All @@ -283,10 +279,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"; }
Expand All @@ -305,9 +299,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);
}

Expand Down