On Jul 24, 2012, at 2:04 PM, Richard Smith wrote:
> On Fri, Jul 20, 2012 at 4:03 PM, Richard Smith <[email protected]> wrote:
> On Wed, Jul 18, 2012 at 9:59 PM, Ted Kremenek <[email protected]> wrote:
> Author: kremenek
> Date: Wed Jul 18 23:59:05 2012
> New Revision: 160494
>
> URL: http://llvm.org/viewvc/llvm-project?rev=160494&view=rev
> Log:
> Simplify UninitializedValues.cpp by removing logic to handle the previous
> (imprecise) representation
> of '&&' and '||' in the CFG. This is no longer needed
>
> Sadly, that appears to be untrue. We now produce a bogus -Wuninitialized
> warning on this:
>
> int x(int*); int f(bool b) { int n = (b || x(&n)) ? 0 : n; return n; }
>
> More generally, && and || as the LHS of a ?: still produce a CFG with false
> edges.
>
> Fixed in r160691.
This broke one of our internal buildbots for the static analyzer, on precisely
this case (|| and ?:) in ctype.h. Here's a simplified test case:
// clang -cc1 -analyze -analyzer-checker=core -x c
int isctype(char c, unsigned long f)
{
return (c < 1 || c > 10) ? 0 : !!(c & f);
}
This is the assertion:
> Assertion failed: (X.isUndef()), function VisitGuardedExpr, file
> ExprEngineC.cpp, line 597.
I don't remember /why/ we have to pass the decision Expr through an
UndefinedVal here, but we're clearly confused by this. I think we're still
expecting to see the || in the CFG before the ?:, and with this change that
doesn't seem to be the case anymore.
Any ideas?
Jordan
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits