From: Denys Petrov Date: Wed, 6 May 2020 11:16:39 +0000 (+0300) Subject: [analyzer] Stability improvement for IteratorModeling X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ba8cda989cf884d53596099dc38a0e5a2c351074;p=platform%2Fupstream%2Fllvm.git [analyzer] Stability improvement for IteratorModeling Summary: Some function path may lead to crash. Fixed using local variable outside the scope through a pointer. Fixed minor misspellings. Added regression test. This patch covers a bug https://bugs.llvm.org/show_bug.cgi?id=41485 Reviewed By: baloghadamsoftware Differential Revision: https://reviews.llvm.org/D78289 --- diff --git a/clang/lib/StaticAnalyzer/Checkers/IteratorModeling.cpp b/clang/lib/StaticAnalyzer/Checkers/IteratorModeling.cpp index 2850c6d..e35918e 100644 --- a/clang/lib/StaticAnalyzer/Checkers/IteratorModeling.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/IteratorModeling.cpp @@ -402,7 +402,7 @@ void IteratorModeling::handleComparison(CheckerContext &C, const Expr *CE, if (!Cont) return; - // At least one of the iterators have recorded positions. If one of them has + // At least one of the iterators has recorded positions. If one of them does // not then create a new symbol for the offset. SymbolRef Sym; if (!LPos || !RPos) { @@ -422,7 +422,7 @@ void IteratorModeling::handleComparison(CheckerContext &C, const Expr *CE, RPos = getIteratorPosition(State, RVal); } - // We cannot make assumpotions on `UnknownVal`. Let us conjure a symbol + // We cannot make assumptions on `UnknownVal`. Let us conjure a symbol // instead. if (RetVal.isUnknown()) { auto &SymMgr = C.getSymbolManager(); @@ -532,8 +532,9 @@ void IteratorModeling::handleRandomIncrOrDecr(CheckerContext &C, return; const auto *value = &RHS; + SVal val; if (auto loc = RHS.getAs()) { - const auto val = State->getRawSVal(*loc); + val = State->getRawSVal(*loc); value = &val; } diff --git a/clang/test/Analysis/iterator-range.cpp b/clang/test/Analysis/iterator-range.cpp index bdfb04b..ad8ce92 100644 --- a/clang/test/Analysis/iterator-range.cpp +++ b/clang/test/Analysis/iterator-range.cpp @@ -810,6 +810,19 @@ void prev_0_end(const std::vector &V) { auto j = std::prev(i, 0); // no-warning } +// std::prev() with int* for checking Loc value argument +namespace std { +template +T prev(T, int *); +} + +void prev_loc_value(const std::vector &V, int o) { + + auto i = return_any_iterator(V.begin()); + int *offset = &o; + auto j = std::prev(i, offset); // no-warning +} + // // Structure member dereference operators //