Author: szelethus Date: Wed Aug 21 19:44:19 2019 New Revision: 369613 URL: http://llvm.org/viewvc/llvm-project?rev=369613&view=rev Log: [analyzer] Don't track the condition of foreach loops
As discussed on the mailing list, notes originating from the tracking of foreach loop conditions are always meaningless. Differential Revision: https://reviews.llvm.org/D66131 Modified: cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp cfe/trunk/test/Analysis/track-control-dependency-conditions.cpp Modified: cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp?rev=369613&r1=369612&r2=369613&view=diff ============================================================================== --- cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp Wed Aug 21 19:44:19 2019 @@ -1800,6 +1800,11 @@ PathDiagnosticPieceRef TrackControlDepen return nullptr; if (ControlDeps.isControlDependent(OriginB, NB)) { + // We don't really want to explain for range loops. Evidence suggests that + // the only thing that leads to is the addition of calls to operator!=. + if (isa<CXXForRangeStmt>(NB->getTerminator())) + return nullptr; + if (const Expr *Condition = NB->getLastCondition()) { // Keeping track of the already tracked conditions on a visitor level // isn't sufficient, because a new visitor is created for each tracked Modified: cfe/trunk/test/Analysis/track-control-dependency-conditions.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/track-control-dependency-conditions.cpp?rev=369613&r1=369612&r2=369613&view=diff ============================================================================== --- cfe/trunk/test/Analysis/track-control-dependency-conditions.cpp (original) +++ cfe/trunk/test/Analysis/track-control-dependency-conditions.cpp Wed Aug 21 19:44:19 2019 @@ -407,6 +407,39 @@ void f() { } } // end of namespace condition_written_in_nested_stackframe_before_assignment +namespace dont_explain_foreach_loops { + +struct Iterator { + int *pos; + bool operator!=(Iterator other) const { + return pos && other.pos && pos != other.pos; + } + int operator*(); + Iterator operator++(); +}; + +struct Container { + Iterator begin(); + Iterator end(); +}; + +void f(Container Cont) { + int flag = 0; + int *x = 0; // expected-note-re{{{{^}}'x' initialized to a null pointer value{{$}}}} + for (int i : Cont) + if (i) // expected-note-re {{{{^}}Assuming 'i' is not equal to 0{{$}}}} + // expected-note-re@-1{{{{^}}Taking true branch{{$}}}} + // debug-note-re@-2{{{{^}}Tracking condition 'i'{{$}}}} + flag = i; + + if (flag) // expected-note-re{{{{^}}'flag' is not equal to 0{{$}}}} + // expected-note-re@-1{{{{^}}Taking true branch{{$}}}} + // debug-note-re@-2{{{{^}}Tracking condition 'flag'{{$}}}} + *x = 5; // expected-warning{{Dereference of null pointer}} + // expected-note@-1{{Dereference of null pointer}} +} +} // end of namespace dont_explain_foreach_loops + namespace condition_lambda_capture_by_reference_last_write { int getInt(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits