diff options
author | Artem Dergachev <artem.dergachev@gmail.com> | 2019-03-29 23:11:10 +0000 |
---|---|---|
committer | Artem Dergachev <artem.dergachev@gmail.com> | 2019-03-29 23:11:10 +0000 |
commit | 4d6fb5789fca8857c5161a621892b69a23a53d25 (patch) | |
tree | 04c6424e72c8c674f2e73651df6ab3723e782158 /clang/lib/StaticAnalyzer/Checkers/MIGChecker.cpp | |
parent | b55637b5d76c6f7aa5aea4bfbd2bc832f9e68ec8 (diff) | |
download | bcm5719-llvm-4d6fb5789fca8857c5161a621892b69a23a53d25.tar.gz bcm5719-llvm-4d6fb5789fca8857c5161a621892b69a23a53d25.zip |
Revert "[analyzer] Introduce a simplified API for adding custom path notes."
This reverts commit r357323.
ASan leaks found by a buildbot :)
Differential Revision: https://reviews.llvm.org/D58367
llvm-svn: 357332
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/MIGChecker.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/MIGChecker.cpp | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/MIGChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MIGChecker.cpp index b5e78b5d58d..685fd88b165 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MIGChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MIGChecker.cpp @@ -80,10 +80,43 @@ public: checkReturnAux(RS, C); } + class Visitor : public BugReporterVisitor { + public: + void Profile(llvm::FoldingSetNodeID &ID) const { + static int X = 0; + ID.AddPointer(&X); + } + + std::shared_ptr<PathDiagnosticPiece> VisitNode(const ExplodedNode *N, + BugReporterContext &BRC, BugReport &R); + }; }; } // end anonymous namespace -REGISTER_TRAIT_WITH_PROGRAMSTATE(ReleasedParameter, bool) +// FIXME: It's a 'const ParmVarDecl *' but there's no ready-made GDM traits +// specialization for this sort of types. +REGISTER_TRAIT_WITH_PROGRAMSTATE(ReleasedParameter, const void *) + +std::shared_ptr<PathDiagnosticPiece> +MIGChecker::Visitor::VisitNode(const ExplodedNode *N, BugReporterContext &BRC, + BugReport &R) { + const auto *NewPVD = static_cast<const ParmVarDecl *>( + N->getState()->get<ReleasedParameter>()); + const auto *OldPVD = static_cast<const ParmVarDecl *>( + N->getFirstPred()->getState()->get<ReleasedParameter>()); + if (OldPVD == NewPVD) + return nullptr; + + assert(NewPVD && "What is deallocated cannot be un-deallocated!"); + SmallString<64> Str; + llvm::raw_svector_ostream OS(Str); + OS << "Value passed through parameter '" << NewPVD->getName() + << "' is deallocated"; + + PathDiagnosticLocation Loc = + PathDiagnosticLocation::create(N->getLocation(), BRC.getSourceManager()); + return std::make_shared<PathDiagnosticEventPiece>(Loc, OS.str()); +} static const ParmVarDecl *getOriginParam(SVal V, CheckerContext &C) { SymbolRef Sym = V.getAsSymbol(); @@ -162,16 +195,7 @@ void MIGChecker::checkPostCall(const CallEvent &Call, CheckerContext &C) const { if (!PVD) return; - const NoteTag *T = C.getNoteTag([this, PVD](BugReport &BR) -> std::string { - if (&BR.getBugType() != &BT) - return ""; - SmallString<64> Str; - llvm::raw_svector_ostream OS(Str); - OS << "Value passed through parameter '" << PVD->getName() - << "\' is deallocated"; - return OS.str(); - }); - C.addTransition(C.getState()->set<ReleasedParameter>(true), T); + C.addTransition(C.getState()->set<ReleasedParameter>(PVD)); } // Returns true if V can potentially represent a "successful" kern_return_t. @@ -236,6 +260,7 @@ void MIGChecker::checkReturnAux(const ReturnStmt *RS, CheckerContext &C) const { R->addRange(RS->getSourceRange()); bugreporter::trackExpressionValue(N, RS->getRetValue(), *R, false); + R->addVisitor(llvm::make_unique<Visitor>()); C.emitReport(std::move(R)); } |