[PATCH] D73359: [analyzer]StreamChecker refactoring (NFC).
This revision was automatically updated to reflect the committed changes. Closed by commit rG5b3983ba3716: [analyzer]StreamChecker refactoring (NFC). (authored by balazske). Herald added a subscriber: martong. Changed prior to commit: https://reviews.llvm.org/D73359?vs=243488&id=244125#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D73359/new/ https://reviews.llvm.org/D73359 Files: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp Index: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp === --- clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -94,15 +94,15 @@ void evalFreopen(const CallEvent &Call, CheckerContext &C) const; void evalFclose(const CallEvent &Call, CheckerContext &C) const; void evalFseek(const CallEvent &Call, CheckerContext &C) const; - void checkArgNullStream(const CallEvent &Call, CheckerContext &C, unsigned ArgI) const; - bool checkNullStream(SVal SV, CheckerContext &C, - ProgramStateRef &State) const; - void checkFseekWhence(SVal SV, CheckerContext &C, -ProgramStateRef &State) const; - bool checkDoubleClose(const CallEvent &Call, CheckerContext &C, -ProgramStateRef &State) const; + + ProgramStateRef checkNullStream(SVal SV, CheckerContext &C, + ProgramStateRef State) const; + ProgramStateRef checkFseekWhence(SVal SV, CheckerContext &C, + ProgramStateRef State) const; + ProgramStateRef checkDoubleClose(const CallEvent &Call, CheckerContext &C, + ProgramStateRef State) const; }; } // end anonymous namespace @@ -176,9 +176,8 @@ return; // Do not allow NULL as passed stream pointer. // This is not specified in the man page but may crash on some system. - checkNullStream(*StreamVal, C, State); - // Check if error was generated. - if (C.isDifferent()) + State = checkNullStream(*StreamVal, C, State); + if (!State) return; SymbolRef StreamSym = StreamVal->getAsSymbol(); @@ -208,7 +207,8 @@ void StreamChecker::evalFclose(const CallEvent &Call, CheckerContext &C) const { ProgramStateRef State = C.getState(); - if (checkDoubleClose(Call, C, State)) + State = checkDoubleClose(Call, C, State); + if (State) C.addTransition(State); } @@ -219,30 +219,31 @@ ProgramStateRef State = C.getState(); - bool StateChanged = checkNullStream(Call.getArgSVal(0), C, State); - // Check if error was generated. - if (C.isDifferent()) + State = checkNullStream(Call.getArgSVal(0), C, State); + if (!State) return; - // Check the legality of the 'whence' argument of 'fseek'. - checkFseekWhence(State->getSVal(AE2, C.getLocationContext()), C, State); + State = + checkFseekWhence(State->getSVal(AE2, C.getLocationContext()), C, State); + if (!State) +return; - if (!C.isDifferent() && StateChanged) -C.addTransition(State); + C.addTransition(State); } void StreamChecker::checkArgNullStream(const CallEvent &Call, CheckerContext &C, unsigned ArgI) const { ProgramStateRef State = C.getState(); - if (checkNullStream(Call.getArgSVal(ArgI), C, State)) + State = checkNullStream(Call.getArgSVal(ArgI), C, State); + if (State) C.addTransition(State); } -bool StreamChecker::checkNullStream(SVal SV, CheckerContext &C, -ProgramStateRef &State) const { +ProgramStateRef StreamChecker::checkNullStream(SVal SV, CheckerContext &C, + ProgramStateRef State) const { Optional DV = SV.getAs(); if (!DV) -return false; +return State; ConstraintManager &CM = C.getConstraintManager(); ProgramStateRef StateNotNull, StateNull; @@ -256,26 +257,22 @@ C.emitReport(std::make_unique( *BT_nullfp, BT_nullfp->getDescription(), N)); } -return false; - } - - if (StateNotNull) { -State = StateNotNull; -return true; +return nullptr; } - return false; + return StateNotNull; } -void StreamChecker::checkFseekWhence(SVal SV, CheckerContext &C, - ProgramStateRef &State) const { +// Check the legality of the 'whence' argument of 'fseek'. +ProgramStateRef StreamChecker::checkFseekWhence(SVal SV, CheckerContext &C, +ProgramStateRef State) const { Optional CI = SV.getAs(); if (!CI) -return; +return State; int64_t X = CI->getValue().getSExtValue(); if (X >= 0 && X <= 2) -return; +return State; if (ExplodedNode *N = C.generateNonFatalErrorNode(State)) { if (!BT_illegalwhence) @@ -285,20 +282,24 @@ "SEEK_SET, SEEK_END, or SEEK_CUR."));
[PATCH] D73359: [analyzer]StreamChecker refactoring (NFC).
balazske updated this revision to Diff 243488. balazske added a comment. Rebase and not using "ProgramStateRef &". Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D73359/new/ https://reviews.llvm.org/D73359 Files: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp Index: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp === --- clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -94,15 +94,15 @@ void evalFreopen(const CallEvent &Call, CheckerContext &C) const; void evalFclose(const CallEvent &Call, CheckerContext &C) const; void evalFseek(const CallEvent &Call, CheckerContext &C) const; - void checkArgNullStream(const CallEvent &Call, CheckerContext &C, unsigned ArgI) const; - bool checkNullStream(SVal SV, CheckerContext &C, - ProgramStateRef &State) const; - void checkFseekWhence(SVal SV, CheckerContext &C, -ProgramStateRef &State) const; - bool checkDoubleClose(const CallEvent &Call, CheckerContext &C, -ProgramStateRef &State) const; + + ProgramStateRef checkNullStream(SVal SV, CheckerContext &C, + ProgramStateRef State) const; + ProgramStateRef checkFseekWhence(SVal SV, CheckerContext &C, + ProgramStateRef State) const; + ProgramStateRef checkDoubleClose(const CallEvent &Call, CheckerContext &C, + ProgramStateRef State) const; }; } // end anonymous namespace @@ -135,31 +135,32 @@ } 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(Call.getOriginExpr()); if (!CE) return; DefinedSVal RetVal = - svalBuilder.conjureSymbolVal(nullptr, CE, LCtx, C.blockCount()) + SVB.conjureSymbolVal(nullptr, CE, LCtx, C.blockCount()) .castAs(); - 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(Sym, StreamState::getOpened()); - stateNull = stateNull->set(Sym, StreamState::getOpenFailed()); + StateNotNull = StateNotNull->set(RetSym, StreamState::getOpened()); + StateNull = StateNull->set(RetSym, StreamState::getOpenFailed()); - C.addTransition(stateNotNull); - C.addTransition(stateNull); + C.addTransition(StateNotNull); + C.addTransition(StateNull); } void StreamChecker::evalFreopen(const CallEvent &Call, @@ -175,9 +176,8 @@ return; // Do not allow NULL as passed stream pointer. // This is not specified in the man page but may crash on some system. - checkNullStream(*StreamVal, C, State); - // Check if error was generated. - if (C.isDifferent()) + State = checkNullStream(*StreamVal, C, State); + if (!State) return; SymbolRef StreamSym = StreamVal->getAsSymbol(); @@ -207,7 +207,8 @@ void StreamChecker::evalFclose(const CallEvent &Call, CheckerContext &C) const { ProgramStateRef State = C.getState(); - if (checkDoubleClose(Call, C, State)) + State = checkDoubleClose(Call, C, State); + if (State) C.addTransition(State); } @@ -218,32 +219,31 @@ ProgramStateRef State = C.getState(); - bool StateChanged = checkNullStream(Call.getArgSVal(0), C, State); - // Check if error was generated. - if (C.isDifferent()) + State = checkNullStream(Call.getArgSVal(0), C, State); + if (!State) return; - // Check the legality of the 'whence' argument of 'fseek'. - checkFseekWhence(State->getSVal(AE2, C.getLocationContext()), C, State); - - if (!C.isDifferent() && StateChanged) -C.addTransition(State); + State = + checkFseekWhence(State->getSVal(AE2, C.getLocationContext()), C, State); + if (!State) +return; - return; + C.addTransition(State); } void StreamChecker::checkArgNullStream(const CallEvent &Call, CheckerContext &C, unsigned ArgI) const { ProgramStateRef State = C.getState
[PATCH] D73359: [analyzer]StreamChecker refactoring (NFC).
Szelethus accepted this revision. Szelethus added a comment. This revision is now accepted and ready to land. Herald added a subscriber: Charusso. LGTM! The code looks a lot cleaner. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D73359/new/ https://reviews.llvm.org/D73359 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits