Skip to content

Commit 00b7979

Browse files
authored
[clang][analyzer][NFC] Combine similar methods of StreamChecker (#70170)
Methods StreamChecker::preFread and StreamChecker::preFwrite are quite similar, so they can be combined to StreamChecker::preFreadFwrite.
1 parent 6687c57 commit 00b7979

File tree

1 file changed

+13
-28
lines changed

1 file changed

+13
-28
lines changed

clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -245,10 +245,10 @@ class StreamChecker : public Checker<check::PreCall, eval::Call,
245245
{{{"fclose"}, 1},
246246
{&StreamChecker::preDefault, &StreamChecker::evalFclose, 0}},
247247
{{{"fread"}, 4},
248-
{&StreamChecker::preFread,
248+
{std::bind(&StreamChecker::preFreadFwrite, _1, _2, _3, _4, true),
249249
std::bind(&StreamChecker::evalFreadFwrite, _1, _2, _3, _4, true), 3}},
250250
{{{"fwrite"}, 4},
251-
{&StreamChecker::preFwrite,
251+
{std::bind(&StreamChecker::preFreadFwrite, _1, _2, _3, _4, false),
252252
std::bind(&StreamChecker::evalFreadFwrite, _1, _2, _3, _4, false), 3}},
253253
{{{"fseek"}, 3},
254254
{&StreamChecker::preFseek, &StreamChecker::evalFseek, 0}},
@@ -305,11 +305,8 @@ class StreamChecker : public Checker<check::PreCall, eval::Call,
305305
void evalFclose(const FnDescription *Desc, const CallEvent &Call,
306306
CheckerContext &C) const;
307307

308-
void preFread(const FnDescription *Desc, const CallEvent &Call,
309-
CheckerContext &C) const;
310-
311-
void preFwrite(const FnDescription *Desc, const CallEvent &Call,
312-
CheckerContext &C) const;
308+
void preFreadFwrite(const FnDescription *Desc, const CallEvent &Call,
309+
CheckerContext &C, bool IsFread) const;
313310

314311
void evalFreadFwrite(const FnDescription *Desc, const CallEvent &Call,
315312
CheckerContext &C, bool IsFread) const;
@@ -637,8 +634,9 @@ void StreamChecker::evalFclose(const FnDescription *Desc, const CallEvent &Call,
637634
C.addTransition(StateFailure);
638635
}
639636

640-
void StreamChecker::preFread(const FnDescription *Desc, const CallEvent &Call,
641-
CheckerContext &C) const {
637+
void StreamChecker::preFreadFwrite(const FnDescription *Desc,
638+
const CallEvent &Call, CheckerContext &C,
639+
bool IsFread) const {
642640
ProgramStateRef State = C.getState();
643641
SVal StreamVal = getStreamArg(Desc, Call);
644642
State = ensureStreamNonNull(StreamVal, Call.getArgExpr(Desc->StreamArgNo), C,
@@ -652,6 +650,11 @@ void StreamChecker::preFread(const FnDescription *Desc, const CallEvent &Call,
652650
if (!State)
653651
return;
654652

653+
if (!IsFread) {
654+
C.addTransition(State);
655+
return;
656+
}
657+
655658
SymbolRef Sym = StreamVal.getAsSymbol();
656659
if (Sym && State->get<StreamMap>(Sym)) {
657660
const StreamState *SS = State->get<StreamMap>(Sym);
@@ -662,24 +665,6 @@ void StreamChecker::preFread(const FnDescription *Desc, const CallEvent &Call,
662665
}
663666
}
664667

665-
void StreamChecker::preFwrite(const FnDescription *Desc, const CallEvent &Call,
666-
CheckerContext &C) const {
667-
ProgramStateRef State = C.getState();
668-
SVal StreamVal = getStreamArg(Desc, Call);
669-
State = ensureStreamNonNull(StreamVal, Call.getArgExpr(Desc->StreamArgNo), C,
670-
State);
671-
if (!State)
672-
return;
673-
State = ensureStreamOpened(StreamVal, C, State);
674-
if (!State)
675-
return;
676-
State = ensureNoFilePositionIndeterminate(StreamVal, C, State);
677-
if (!State)
678-
return;
679-
680-
C.addTransition(State);
681-
}
682-
683668
void StreamChecker::evalFreadFwrite(const FnDescription *Desc,
684669
const CallEvent &Call, CheckerContext &C,
685670
bool IsFread) const {
@@ -1222,7 +1207,7 @@ StreamChecker::reportLeaks(const SmallVector<SymbolRef, 2> &LeakedSyms,
12221207

12231208
PathDiagnosticLocation LocUsedForUniqueing;
12241209
if (const Stmt *StreamStmt = StreamOpenNode->getStmtForDiagnostics())
1225-
LocUsedForUniqueing = PathDiagnosticLocation::createBegin(
1210+
LocUsedForUniqueing = PathDiagnosticLocation::createBegin(
12261211
StreamStmt, C.getSourceManager(),
12271212
StreamOpenNode->getLocationContext());
12281213

0 commit comments

Comments
 (0)