1313#include " clang/AST/Decl.h"
1414#include " clang/AST/DeclCXX.h"
1515#include " clang/AST/DynamicRecursiveASTVisitor.h"
16- #include " clang/Analysis/DomainSpecific/CocoaConventions.h"
1716#include " clang/Basic/SourceLocation.h"
1817#include " clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h"
1918#include " clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
@@ -36,9 +35,6 @@ class RawPtrRefCallArgsChecker
3635 TrivialFunctionAnalysis TFA;
3736 EnsureFunctionAnalysis EFA;
3837
39- protected:
40- mutable std::optional<RetainTypeChecker> RTC;
41-
4238public:
4339 RawPtrRefCallArgsChecker (const char *description)
4440 : Bug(this , description, " WebKit coding guidelines" ) {}
@@ -84,22 +80,9 @@ class RawPtrRefCallArgsChecker
8480 Checker->visitCallExpr (CE, DeclWithIssue);
8581 return true ;
8682 }
87-
88- bool VisitTypedefDecl (TypedefDecl *TD) override {
89- if (Checker->RTC )
90- Checker->RTC ->visitTypedef (TD);
91- return true ;
92- }
93-
94- bool VisitObjCMessageExpr (ObjCMessageExpr *ObjCMsgExpr) override {
95- Checker->visitObjCMessageExpr (ObjCMsgExpr, DeclWithIssue);
96- return true ;
97- }
9883 };
9984
10085 LocalVisitor visitor (this );
101- if (RTC)
102- RTC->visitTranslationUnitDecl (TUD);
10386 visitor.TraverseDecl (const_cast <TranslationUnitDecl *>(TUD));
10487 }
10588
@@ -139,7 +122,7 @@ class RawPtrRefCallArgsChecker
139122 // if ((*P)->hasAttr<SafeRefCntblRawPtrAttr>())
140123 // continue;
141124
142- QualType ArgType = (*P)->getType ();
125+ QualType ArgType = (*P)->getType (). getCanonicalType () ;
143126 // FIXME: more complex types (arrays, references to raw pointers, etc)
144127 std::optional<bool > IsUncounted = isUnsafePtr (ArgType);
145128 if (!IsUncounted || !(*IsUncounted))
@@ -155,58 +138,6 @@ class RawPtrRefCallArgsChecker
155138
156139 reportBug (Arg, *P, D);
157140 }
158- for (; ArgIdx < CE->getNumArgs (); ++ArgIdx) {
159- const auto *Arg = CE->getArg (ArgIdx);
160- auto ArgType = Arg->getType ();
161- std::optional<bool > IsUncounted = isUnsafePtr (ArgType);
162- if (!IsUncounted || !(*IsUncounted))
163- continue ;
164-
165- if (auto *defaultArg = dyn_cast<CXXDefaultArgExpr>(Arg))
166- Arg = defaultArg->getExpr ();
167-
168- if (isPtrOriginSafe (Arg))
169- continue ;
170-
171- reportBug (Arg, nullptr , D);
172- }
173- }
174- }
175-
176- void visitObjCMessageExpr (const ObjCMessageExpr *E, const Decl *D) const {
177- if (BR->getSourceManager ().isInSystemHeader (E->getExprLoc ()))
178- return ;
179-
180- auto Selector = E->getSelector ();
181- if (auto *Receiver = E->getInstanceReceiver ()->IgnoreParenCasts ()) {
182- std::optional<bool > IsUnsafe = isUnsafePtr (E->getReceiverType ());
183- if (IsUnsafe && *IsUnsafe && !isPtrOriginSafe (Receiver)) {
184- if (auto *InnerMsg = dyn_cast<ObjCMessageExpr>(Receiver)) {
185- auto InnerSelector = InnerMsg->getSelector ();
186- if (InnerSelector.getNameForSlot (0 ) == " alloc" &&
187- Selector.getNameForSlot (0 ).starts_with (" init" ))
188- return ;
189- }
190- reportBugOnReceiver (Receiver, D);
191- }
192- }
193-
194- auto *MethodDecl = E->getMethodDecl ();
195- if (!MethodDecl)
196- return ;
197-
198- auto ArgCount = E->getNumArgs ();
199- for (unsigned i = 0 ; i < ArgCount; ++i) {
200- auto *Arg = E->getArg (i);
201- bool hasParam = i < MethodDecl->param_size ();
202- auto *Param = hasParam ? MethodDecl->getParamDecl (i) : nullptr ;
203- auto ArgType = Arg->getType ();
204- std::optional<bool > IsUnsafe = isUnsafePtr (ArgType);
205- if (!IsUnsafe || !(*IsUnsafe))
206- continue ;
207- if (isPtrOriginSafe (Arg))
208- continue ;
209- reportBug (Arg, Param, D);
210141 }
211142 }
212143
@@ -227,8 +158,6 @@ class RawPtrRefCallArgsChecker
227158 // foo(NULL)
228159 return true ;
229160 }
230- if (isa<ObjCStringLiteral>(ArgOrigin))
231- return true ;
232161 if (isASafeCallArg (ArgOrigin))
233162 return true ;
234163 if (EFA.isACallToEnsureFn (ArgOrigin))
@@ -283,7 +212,7 @@ class RawPtrRefCallArgsChecker
283212 overloadedOperatorType == OO_PipePipe)
284213 return true ;
285214
286- if (isCtorOfSafePtr (Callee))
215+ if (isCtorOfRefCounted (Callee))
287216 return true ;
288217
289218 auto name = safeGetName (Callee);
@@ -348,10 +277,9 @@ class RawPtrRefCallArgsChecker
348277 }
349278 Os << " is " << ptrKind () << " and unsafe." ;
350279
351- bool usesDefaultArgValue = isa<CXXDefaultArgExpr>(CallArg) && Param;
352280 const SourceLocation SrcLocToReport =
353- usesDefaultArgValue ? Param->getDefaultArg ()->getExprLoc ()
354- : CallArg->getSourceRange ().getBegin ();
281+ isa<CXXDefaultArgExpr>(CallArg) ? Param->getDefaultArg ()->getExprLoc ()
282+ : CallArg->getSourceRange ().getBegin ();
355283
356284 PathDiagnosticLocation BSLoc (SrcLocToReport, BR->getSourceManager ());
357285 auto Report = std::make_unique<BasicBugReport>(Bug, Os.str (), BSLoc);
@@ -376,23 +304,6 @@ class RawPtrRefCallArgsChecker
376304 Report->setDeclWithIssue (DeclWithIssue);
377305 BR->emitReport (std::move (Report));
378306 }
379-
380- void reportBugOnReceiver (const Expr *CallArg,
381- const Decl *DeclWithIssue) const {
382- assert (CallArg);
383-
384- const SourceLocation SrcLocToReport = CallArg->getSourceRange ().getBegin ();
385-
386- SmallString<100 > Buf;
387- llvm::raw_svector_ostream Os (Buf);
388- Os << " Reciever is " << ptrKind () << " and unsafe." ;
389-
390- PathDiagnosticLocation BSLoc (SrcLocToReport, BR->getSourceManager ());
391- auto Report = std::make_unique<BasicBugReport>(Bug, Os.str (), BSLoc);
392- Report->addRange (CallArg->getSourceRange ());
393- Report->setDeclWithIssue (DeclWithIssue);
394- BR->emitReport (std::move (Report));
395- }
396307};
397308
398309class UncountedCallArgsChecker final : public RawPtrRefCallArgsChecker {
@@ -406,7 +317,7 @@ class UncountedCallArgsChecker final : public RawPtrRefCallArgsChecker {
406317 }
407318
408319 std::optional<bool > isUnsafePtr (QualType QT) const final {
409- return isUncountedPtr (QT. getCanonicalType () );
320+ return isUncountedPtr (QT);
410321 }
411322
412323 bool isSafePtr (const CXXRecordDecl *Record) const final {
@@ -431,7 +342,7 @@ class UncheckedCallArgsChecker final : public RawPtrRefCallArgsChecker {
431342 }
432343
433344 std::optional<bool > isUnsafePtr (QualType QT) const final {
434- return isUncheckedPtr (QT. getCanonicalType () );
345+ return isUncheckedPtr (QT);
435346 }
436347
437348 bool isSafePtr (const CXXRecordDecl *Record) const final {
@@ -445,33 +356,6 @@ class UncheckedCallArgsChecker final : public RawPtrRefCallArgsChecker {
445356 const char *ptrKind () const final { return " unchecked" ; }
446357};
447358
448- class UnretainedCallArgsChecker final : public RawPtrRefCallArgsChecker {
449- public:
450- UnretainedCallArgsChecker ()
451- : RawPtrRefCallArgsChecker(" Unretained call argument for a raw "
452- " pointer/reference parameter" ) {
453- RTC = RetainTypeChecker ();
454- }
455-
456- std::optional<bool > isUnsafeType (QualType QT) const final {
457- return RTC->isUnretained (QT);
458- }
459-
460- std::optional<bool > isUnsafePtr (QualType QT) const final {
461- return RTC->isUnretained (QT);
462- }
463-
464- bool isSafePtr (const CXXRecordDecl *Record) const final {
465- return isRetainPtr (Record);
466- }
467-
468- bool isSafePtrType (const QualType type) const final {
469- return isRetainPtrType (type);
470- }
471-
472- const char *ptrKind () const final { return " unretained" ; }
473- };
474-
475359} // namespace
476360
477361void ento::registerUncountedCallArgsChecker (CheckerManager &Mgr) {
@@ -489,11 +373,3 @@ void ento::registerUncheckedCallArgsChecker(CheckerManager &Mgr) {
489373bool ento::shouldRegisterUncheckedCallArgsChecker (const CheckerManager &) {
490374 return true ;
491375}
492-
493- void ento::registerUnretainedCallArgsChecker (CheckerManager &Mgr) {
494- Mgr.registerChecker <UnretainedCallArgsChecker>();
495- }
496-
497- bool ento::shouldRegisterUnretainedCallArgsChecker (const CheckerManager &) {
498- return true ;
499- }
0 commit comments