forked from OSchip/llvm-project
[analyzer] Small StreamChecker refactoring (NFC).
Reviewers: Szelethus Reviewed By: Szelethus Subscribers: xazax.hun, baloghadamsoftware, szepet, a.sidorin, mikhail.ramalho, donat.nagy, Charusso, dkrupp, Szelethus, gamesh411, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D73350
This commit is contained in:
parent
f85d3408e6
commit
c4f0f8ec41
|
@ -135,31 +135,32 @@ bool StreamChecker::evalCall(const CallEvent &Call, CheckerContext &C) const {
|
|||
}
|
||||
|
||||
void StreamChecker::evalFopen(const CallEvent &Call, CheckerContext &C) const {
|
||||
ProgramStateRef state = C.getState();
|
||||
SValBuilder &svalBuilder = C.getSValBuilder();
|
||||
ProgramStateRef State = C.getState();
|
||||
SValBuilder &SVB = C.getSValBuilder();
|
||||
const LocationContext *LCtx = C.getPredecessor()->getLocationContext();
|
||||
|
||||
auto *CE = dyn_cast_or_null<CallExpr>(Call.getOriginExpr());
|
||||
if (!CE)
|
||||
return;
|
||||
|
||||
DefinedSVal RetVal =
|
||||
svalBuilder.conjureSymbolVal(nullptr, CE, LCtx, C.blockCount())
|
||||
.castAs<DefinedSVal>();
|
||||
state = state->BindExpr(CE, C.getLocationContext(), RetVal);
|
||||
DefinedSVal RetVal = SVB.conjureSymbolVal(nullptr, CE, LCtx, C.blockCount())
|
||||
.castAs<DefinedSVal>();
|
||||
SymbolRef RetSym = RetVal.getAsSymbol();
|
||||
assert(RetSym && "RetVal must be a symbol here.");
|
||||
|
||||
State = State->BindExpr(CE, C.getLocationContext(), RetVal);
|
||||
|
||||
ConstraintManager &CM = C.getConstraintManager();
|
||||
// Bifurcate the state into two: one with a valid FILE* pointer, the other
|
||||
// with a NULL.
|
||||
ProgramStateRef stateNotNull, stateNull;
|
||||
std::tie(stateNotNull, stateNull) = CM.assumeDual(state, RetVal);
|
||||
ProgramStateRef StateNotNull, StateNull;
|
||||
std::tie(StateNotNull, StateNull) =
|
||||
C.getConstraintManager().assumeDual(State, RetVal);
|
||||
|
||||
SymbolRef Sym = RetVal.getAsSymbol();
|
||||
assert(Sym && "RetVal must be a symbol here.");
|
||||
stateNotNull = stateNotNull->set<StreamMap>(Sym, StreamState::getOpened());
|
||||
stateNull = stateNull->set<StreamMap>(Sym, StreamState::getOpenFailed());
|
||||
StateNotNull = StateNotNull->set<StreamMap>(RetSym, StreamState::getOpened());
|
||||
StateNull = StateNull->set<StreamMap>(RetSym, StreamState::getOpenFailed());
|
||||
|
||||
C.addTransition(stateNotNull);
|
||||
C.addTransition(stateNull);
|
||||
C.addTransition(StateNotNull);
|
||||
C.addTransition(StateNull);
|
||||
}
|
||||
|
||||
void StreamChecker::evalFreopen(const CallEvent &Call,
|
||||
|
@ -228,8 +229,6 @@ void StreamChecker::evalFseek(const CallEvent &Call, CheckerContext &C) const {
|
|||
|
||||
if (!C.isDifferent() && StateChanged)
|
||||
C.addTransition(State);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void StreamChecker::checkArgNullStream(const CallEvent &Call, CheckerContext &C,
|
||||
|
|
Loading…
Reference in New Issue