r369613 - [analyzer] Don't track the condition of foreach loops
Kristof Umann via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 21 19:44:19 PDT 2019
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 at -1{{{{^}}Taking true branch{{$}}}}
+ // debug-note-re at -2{{{{^}}Tracking condition 'i'{{$}}}}
+ flag = i;
+
+ if (flag) // expected-note-re{{{{^}}'flag' is not equal to 0{{$}}}}
+ // expected-note-re at -1{{{{^}}Taking true branch{{$}}}}
+ // debug-note-re at -2{{{{^}}Tracking condition 'flag'{{$}}}}
+ *x = 5; // expected-warning{{Dereference of null pointer}}
+ // expected-note at -1{{Dereference of null pointer}}
+}
+} // end of namespace dont_explain_foreach_loops
+
namespace condition_lambda_capture_by_reference_last_write {
int getInt();
More information about the cfe-commits
mailing list