Merged to release_90 in r368427.
On Mon, Aug 5, 2019 at 8:44 AM Adam Balogh via cfe-commits <cfe-commits@lists.llvm.org> wrote: > > Author: baloghadamsoftware > Date: Sun Aug 4 23:45:41 2019 > New Revision: 367802 > > URL: http://llvm.org/viewvc/llvm-project?rev=367802&view=rev > Log: > [Analyzer] Iterator Checkers - Fix for Crash on Iterator Differences > > Iterators differences were mistakenly handled as random decrements which > causes an assertion. This patch fixes this. > > > Modified: > cfe/trunk/lib/StaticAnalyzer/Checkers/IteratorChecker.cpp > cfe/trunk/test/Analysis/Inputs/system-header-simulator-cxx.h > cfe/trunk/test/Analysis/diagnostics/explicit-suppression.cpp > cfe/trunk/test/Analysis/iterator-range.cpp > > Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/IteratorChecker.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/IteratorChecker.cpp?rev=367802&r1=367801&r2=367802&view=diff > ============================================================================== > --- cfe/trunk/lib/StaticAnalyzer/Checkers/IteratorChecker.cpp (original) > +++ cfe/trunk/lib/StaticAnalyzer/Checkers/IteratorChecker.cpp Sun Aug 4 > 23:45:41 2019 > @@ -406,13 +406,15 @@ void IteratorChecker::checkPreCall(const > } else if (isRandomIncrOrDecrOperator(Func->getOverloadedOperator())) { > if (const auto *InstCall = dyn_cast<CXXInstanceCall>(&Call)) { > // Check for out-of-range incrementions and decrementions > - if (Call.getNumArgs() >= 1) { > + if (Call.getNumArgs() >= 1 && > + Call.getArgExpr(0)->getType()->isIntegralOrEnumerationType()) { > verifyRandomIncrOrDecr(C, Func->getOverloadedOperator(), > InstCall->getCXXThisVal(), > Call.getArgSVal(0)); > } > } else { > - if (Call.getNumArgs() >= 2) { > + if (Call.getNumArgs() >= 2 && > + Call.getArgExpr(1)->getType()->isIntegralOrEnumerationType()) { > verifyRandomIncrOrDecr(C, Func->getOverloadedOperator(), > Call.getArgSVal(0), Call.getArgSVal(1)); > } > @@ -590,14 +592,16 @@ void IteratorChecker::checkPostCall(cons > return; > } else if (isRandomIncrOrDecrOperator(Func->getOverloadedOperator())) { > if (const auto *InstCall = dyn_cast<CXXInstanceCall>(&Call)) { > - if (Call.getNumArgs() >= 1) { > + if (Call.getNumArgs() >= 1 && > + Call.getArgExpr(0)->getType()->isIntegralOrEnumerationType()) { > handleRandomIncrOrDecr(C, Func->getOverloadedOperator(), > Call.getReturnValue(), > InstCall->getCXXThisVal(), > Call.getArgSVal(0)); > return; > } > } else { > - if (Call.getNumArgs() >= 2) { > + if (Call.getNumArgs() >= 2 && > + Call.getArgExpr(1)->getType()->isIntegralOrEnumerationType()) { > handleRandomIncrOrDecr(C, Func->getOverloadedOperator(), > Call.getReturnValue(), Call.getArgSVal(0), > Call.getArgSVal(1)); > > Modified: cfe/trunk/test/Analysis/Inputs/system-header-simulator-cxx.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/Inputs/system-header-simulator-cxx.h?rev=367802&r1=367801&r2=367802&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/Inputs/system-header-simulator-cxx.h (original) > +++ cfe/trunk/test/Analysis/Inputs/system-header-simulator-cxx.h Sun Aug 4 > 23:45:41 2019 > @@ -70,6 +70,9 @@ template <typename T, typename Ptr, type > return ptr -= n; > } > > + template<typename U, typename Ptr2, typename Ref2> > + difference_type operator-(const __vector_iterator<U, Ptr2, Ref2> &rhs); > + > Ref operator*() const { return *ptr; } > Ptr operator->() const { return *ptr; } > > > Modified: cfe/trunk/test/Analysis/diagnostics/explicit-suppression.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/diagnostics/explicit-suppression.cpp?rev=367802&r1=367801&r2=367802&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/diagnostics/explicit-suppression.cpp (original) > +++ cfe/trunk/test/Analysis/diagnostics/explicit-suppression.cpp Sun Aug 4 > 23:45:41 2019 > @@ -19,6 +19,6 @@ class C { > void testCopyNull(C *I, C *E) { > std::copy(I, E, (C *)0); > #ifndef SUPPRESSED > - // expected-warning@../Inputs/system-header-simulator-cxx.h:677 {{Called > C++ object pointer is null}} > + // expected-warning@../Inputs/system-header-simulator-cxx.h:680 {{Called > C++ object pointer is null}} > #endif > } > > Modified: cfe/trunk/test/Analysis/iterator-range.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/iterator-range.cpp?rev=367802&r1=367801&r2=367802&view=diff > ============================================================================== > --- cfe/trunk/test/Analysis/iterator-range.cpp (original) > +++ cfe/trunk/test/Analysis/iterator-range.cpp Sun Aug 4 23:45:41 2019 > @@ -236,3 +236,8 @@ void good_derived(simple_container c) { > *i0; // no-warning > } > } > + > +void iter_diff(std::vector<int> &V) { > + auto i0 = V.begin(), i1 = V.end(); > + ptrdiff_t len = i1 - i0; // no-crash > +} > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits