diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp index 811888e119449..25b77ef989388 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp @@ -46,8 +46,18 @@ hasPublicMethodInBase(const CXXBaseSpecifier *Base, StringRef NameToMatch) { return std::nullopt; const CXXRecordDecl *R = T->getAsCXXRecordDecl(); - if (!R) - return std::nullopt; + if (!R) { + auto CT = Base->getType().getCanonicalType(); + if (auto *TST = dyn_cast(CT)) { + auto TmplName = TST->getTemplateName(); + if (!TmplName.isNull()) { + if (auto *TD = TmplName.getAsTemplateDecl()) + R = dyn_cast_or_null(TD->getTemplatedDecl()); + } + } + if (!R) + return std::nullopt; + } if (!R->hasDefinition()) return std::nullopt; diff --git a/clang/test/Analysis/Checkers/WebKit/unchecked-call-arg.cpp b/clang/test/Analysis/Checkers/WebKit/unchecked-call-arg.cpp new file mode 100644 index 0000000000000..8685978ebf1ac --- /dev/null +++ b/clang/test/Analysis/Checkers/WebKit/unchecked-call-arg.cpp @@ -0,0 +1,34 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncheckedCallArgsChecker -verify %s + +void WTFCrash(void); + +enum class Tag : bool { Value }; + +template class CanMakeCheckedPtrBase { +public: + void incrementCheckedPtrCount() const { ++m_checkedPtrCount; } + inline void decrementCheckedPtrCount() const + { + if (!m_checkedPtrCount) + WTFCrash(); + --m_checkedPtrCount; + } + +private: + mutable StorageType m_checkedPtrCount { 0 }; +}; + +template +class CanMakeCheckedPtr : public CanMakeCheckedPtrBase { +}; + +class CheckedObject : public CanMakeCheckedPtr { +public: + void doWork(); +}; + +CheckedObject* provide(); +void foo() { + provide()->doWork(); + // expected-warning@-1{{Call argument for 'this' parameter is unchecked and unsafe}} +}