summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer/Checkers/MIGChecker.cpp
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2019-03-29 23:11:10 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2019-03-29 23:11:10 +0000
commit4d6fb5789fca8857c5161a621892b69a23a53d25 (patch)
tree04c6424e72c8c674f2e73651df6ab3723e782158 /clang/lib/StaticAnalyzer/Checkers/MIGChecker.cpp
parentb55637b5d76c6f7aa5aea4bfbd2bc832f9e68ec8 (diff)
downloadbcm5719-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.cpp47
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));
}
OpenPOWER on IntegriCloud