aboutsummaryrefslogtreecommitdiff
path: root/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp')
-rw-r--r--lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp11
1 files changed, 7 insertions, 4 deletions
diff --git a/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp b/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp
index d62002c4ab..22176fd5f2 100644
--- a/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp
+++ b/lib/StaticAnalyzer/Checkers/SimpleStreamChecker.cpp
@@ -140,16 +140,19 @@ void SimpleStreamChecker::checkDeadSymbols(SymbolReaper &SymReaper,
CheckerContext &C) const {
ProgramStateRef State = C.getState();
StreamMapTy TrackedStreams = State->get<StreamMap>();
+
SymbolVector LeakedStreams;
for (StreamMapTy::iterator I = TrackedStreams.begin(),
- E = TrackedStreams.end(); I != E; ++I) {
+ E = TrackedStreams.end(); I != E; ++I) {
SymbolRef Sym = I->first;
if (SymReaper.isDead(Sym)) {
const StreamState &SS = I->second;
if (SS.isOpened()) {
- // If a symbolic region is NULL, assume that allocation failed on
- // this path and do not report a leak.
- if (!State->getConstraintManager().isNull(State, Sym).isTrue())
+ // If a symbol is NULL, assume that fopen failed on this path
+ // and do not report a leak.
+ ConstraintManager &CMgr = State->getConstraintManager();
+ ConditionTruthVal OpenFailed = CMgr.isNull(State, Sym);
+ if (!OpenFailed.isConstrainedTrue())
LeakedStreams.push_back(Sym);
}