Skip to content

Commit a7e5312

Browse files
authored
[alpha.webkit.UncheckedCallArgsChecker] Checker fails to recognize CanMakeCheckedPtrBase (llvm#136500)
This PR fixes the bug that alpha.webkit.UncheckedCallArgsChecker did not recognize CanMakeCheckedPtrBase due to getAsCXXRecordDecl returning nullptr for it in hasPublicMethodInBase. Manually grab getTemplatedDecl out of TemplateSpecializationType then CXXRecordDecl to workaround this bug in clang frontend.
1 parent 9f74d51 commit a7e5312

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

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

+12-2
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,18 @@ hasPublicMethodInBase(const CXXBaseSpecifier *Base, StringRef NameToMatch) {
4646
return std::nullopt;
4747

4848
const CXXRecordDecl *R = T->getAsCXXRecordDecl();
49-
if (!R)
50-
return std::nullopt;
49+
if (!R) {
50+
auto CT = Base->getType().getCanonicalType();
51+
if (auto *TST = dyn_cast<TemplateSpecializationType>(CT)) {
52+
auto TmplName = TST->getTemplateName();
53+
if (!TmplName.isNull()) {
54+
if (auto *TD = TmplName.getAsTemplateDecl())
55+
R = dyn_cast_or_null<CXXRecordDecl>(TD->getTemplatedDecl());
56+
}
57+
}
58+
if (!R)
59+
return std::nullopt;
60+
}
5161
if (!R->hasDefinition())
5262
return std::nullopt;
5363

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncheckedCallArgsChecker -verify %s
2+
3+
void WTFCrash(void);
4+
5+
enum class Tag : bool { Value };
6+
7+
template <typename StorageType, Tag> class CanMakeCheckedPtrBase {
8+
public:
9+
void incrementCheckedPtrCount() const { ++m_checkedPtrCount; }
10+
inline void decrementCheckedPtrCount() const
11+
{
12+
if (!m_checkedPtrCount)
13+
WTFCrash();
14+
--m_checkedPtrCount;
15+
}
16+
17+
private:
18+
mutable StorageType m_checkedPtrCount { 0 };
19+
};
20+
21+
template<typename T, Tag tag>
22+
class CanMakeCheckedPtr : public CanMakeCheckedPtrBase<unsigned int, tag> {
23+
};
24+
25+
class CheckedObject : public CanMakeCheckedPtr<CheckedObject, Tag::Value> {
26+
public:
27+
void doWork();
28+
};
29+
30+
CheckedObject* provide();
31+
void foo() {
32+
provide()->doWork();
33+
// expected-warning@-1{{Call argument for 'this' parameter is unchecked and unsafe}}
34+
}

0 commit comments

Comments
 (0)