Skip to content

Commit 93a2a8c

Browse files
authored
Fix a crash in clang::isGetterOfRefCounted by checking nullptr in tryToFindPtrOrigin (llvm#80768)
1 parent 6ce4181 commit 93a2a8c

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,16 @@ tryToFindPtrOrigin(const Expr *E, bool StopAtFirstRefCountedObj) {
3434
}
3535
if (auto *call = dyn_cast<CallExpr>(E)) {
3636
if (auto *memberCall = dyn_cast<CXXMemberCallExpr>(call)) {
37-
std::optional<bool> IsGetterOfRefCt = isGetterOfRefCounted(memberCall->getMethodDecl());
38-
if (IsGetterOfRefCt && *IsGetterOfRefCt) {
39-
E = memberCall->getImplicitObjectArgument();
40-
if (StopAtFirstRefCountedObj) {
41-
return {E, true};
37+
if (auto *decl = memberCall->getMethodDecl()) {
38+
std::optional<bool> IsGetterOfRefCt =
39+
isGetterOfRefCounted(memberCall->getMethodDecl());
40+
if (IsGetterOfRefCt && *IsGetterOfRefCt) {
41+
E = memberCall->getImplicitObjectArgument();
42+
if (StopAtFirstRefCountedObj) {
43+
return {E, true};
44+
}
45+
continue;
4246
}
43-
continue;
4447
}
4548
}
4649

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncountedLocalVarsChecker -verify %s
2+
3+
#include "mock-types.h"
4+
5+
class RenderStyle;
6+
7+
class FillLayer {
8+
public:
9+
void ref() const;
10+
void deref() const;
11+
};
12+
13+
class FillLayersPropertyWrapper {
14+
public:
15+
typedef const FillLayer& (RenderStyle::*LayersGetter)() const;
16+
17+
private:
18+
bool canInterpolate(const RenderStyle& from) const
19+
{
20+
auto* fromLayer = &(from.*m_layersGetter)();
21+
// expected-warning@-1{{Local variable 'fromLayer' is uncounted and unsafe}}
22+
return true;
23+
}
24+
25+
LayersGetter m_layersGetter;
26+
};

0 commit comments

Comments
 (0)