[PATCH] [analyzer] Fix regression in ResolveCondition()
Pavel Labath
labath at google.com
Fri Jul 19 04:48:24 PDT 2013
Hi jordan_rose,
after flipping cfg-temporary-destructors to true, I noticed an assertion failure
in ExprEngine when processing complex conditional expressions. Apparently, the
produced CFG were no longer of the form the function was expecting. Simply
removing the assertion allows the analyzer to continue, and I notice no further
regressions resulting from the change. I added tests to verify that conditions
are still handled correctly.
http://llvm-reviews.chandlerc.com/D1186
Files:
lib/StaticAnalyzer/Core/ExprEngine.cpp
test/Analysis/temporaries.cpp
Index: lib/StaticAnalyzer/Core/ExprEngine.cpp
===================================================================
--- lib/StaticAnalyzer/Core/ExprEngine.cpp
+++ lib/StaticAnalyzer/Core/ExprEngine.cpp
@@ -1323,8 +1323,6 @@
return Condition;
}
- assert(I != E);
-
while (Condition) {
BO = dyn_cast<BinaryOperator>(Condition);
if (!BO || !BO->isLogicalOp())
Index: test/Analysis/temporaries.cpp
===================================================================
--- test/Analysis/temporaries.cpp
+++ test/Analysis/temporaries.cpp
@@ -125,3 +125,30 @@
clang_analyzer_eval(threadDirectRef.value == 42); // expected-warning{{TRUE}}
#endif
}
+
+namespace branching {
+ // the following code used to produce an assertion failure in
+ // ExprEngine.cpp, in ResolveCondition()
+ void fn() { 1 && ((0 && 0) || (NonTrivial(1), 1)); }
+
+ // after fixing, make sure conditions are still evaluated as expected
+ bool unknown();
+ bool id(bool x, bool &a) { a = x; return x; }
+ bool neg(bool x, bool &a) { a = x; return !x; }
+
+ void fn1(bool x) {
+ bool a1, a2, a3, a4;
+ a1 = a2 = a3 = a4 = unknown();
+ if (neg(x, a1) && ((id(x, a2) && id(x, a3)) || (NonTrivial(1), neg(x, a4)))) {
+ clang_analyzer_eval(a1); // expected-warning{{FALSE}}
+ clang_analyzer_eval(a2); // expected-warning{{FALSE}}
+ clang_analyzer_eval(a3); // expected-warning{{UNKNOWN}}
+ clang_analyzer_eval(a4); // expected-warning{{FALSE}}
+ } else {
+ clang_analyzer_eval(a1); // expected-warning{{TRUE}}
+ clang_analyzer_eval(a2); // expected-warning{{UNKNOWN}}
+ clang_analyzer_eval(a3); // expected-warning{{UNKNOWN}}
+ clang_analyzer_eval(a4); // expected-warning{{UNKNOWN}}
+ }
+ }
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D1186.1.patch
Type: text/x-patch
Size: 1743 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130719/3a1c9858/attachment.bin>
More information about the cfe-commits
mailing list