[PATCH] Fix SimpleSValBuilder::evalBinOpLN

Jordan Rose jordan_rose at apple.com
Sun Jun 23 15:32:14 PDT 2013


Hi, Matthew. In pointer expressions like "p != 0", the 0 gets converted to a pointer before the comparison, so that goes through evalBinOpLL(). Do you have any solid examples where this is failing?

Jordan


On Jun 22, 2013, at 18:49 , Matthew Dempsky <matthew at dempsky.org> wrote:

> evalBinOpLN() has a special case for detection that the RHS is zero,
> in which case it simply returns the LHS.  This works for arithmetic
> like "p + 0" and "p - 0", but it's wrong for comparisons like "p != 0"
> and "p == 0".
> 
> For one, it means the returned SVal expression has the wrong type
> sometimes (pointer instead of bool), but it leads to other issues too.
> E.g., evalEQ(St, evalEQ(St, P, Null), evalEQ(St, Q, Null)) returns an
> SVal representing "p == q" instead of "!p == !q".
> 
> I was hoping to make a simple debug.ExprInspection test case like:
> 
>    int a, b;
>    clang_analyzer_eval((&a == 0) == (&b == 0)); // expected-warning{{TRUE}}
> 
> But that passes even without this fix, so I'm not sure how to unit
> test this change.  Suggestions welcome.
> 
> 
> Index: clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
> ===================================================================
> --- clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp	(revision 184494)
> +++ clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp	(working copy)
> @@ -838,10 +838,6 @@
>                                   BinaryOperator::Opcode op,
>                                   Loc lhs, NonLoc rhs, QualType resultTy) {
> 
> -  // Special case: rhs is a zero constant.
> -  if (rhs.isZeroConstant())
> -    return lhs;
> -  
>   // Special case: 'rhs' is an integer that has the same width as a pointer and
>   // we are using the integer location in a comparison.  Normally this cannot be
>   // triggered, but transfer functions like those for OSCompareAndSwapBarrier32
> @@ -865,6 +861,10 @@
> 
>   // We are dealing with pointer arithmetic.
> 
> +  // Special case: rhs is a zero constant.
> +  if (rhs.isZeroConstant())
> +    return lhs;
> +
>   // Handle pointer arithmetic on constant values.
>   if (Optional<nonloc::ConcreteInt> rhsInt = rhs.getAs<nonloc::ConcreteInt>()) {
>     if (Optional<loc::ConcreteInt> lhsInt = lhs.getAs<loc::ConcreteInt>()) {
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list