Commit c4f0f8ec authored by Balázs Kéri's avatar Balázs Kéri
Browse files

[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
parent f85d3408
Loading
Loading
Loading
Loading
+16 −17
Original line number Diff line number Diff line
@@ -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())
  DefinedSVal RetVal = SVB.conjureSymbolVal(nullptr, CE, LCtx, C.blockCount())
                           .castAs<DefinedSVal>();
  state = state->BindExpr(CE, C.getLocationContext(), RetVal);
  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,