baloghadamsoftware added a comment.

Your suggestion sounds completely reasonable. We cannot rely entirely on 
inlining of comparison operators. However, there is an important side-effect of 
inlining: on iterator-adapters inlining ensures that we handle the comparison 
of the underlying iterator correctly. Without inlining, `evalCall()` only works 
on the outermost iterator which is not always correct: it may happen that the 
checker cannot conclude any useful relation between the two iterator-adapters 
but there are some relations stored about the inner iterators. Based on my 
experiments quite many of the false-positives are related to iterator-adapters. 
 So I am afraid that we introduce even more false-positives by losing inlining.

I  wonder whether the current "mixed" approach introduces additional paths 
because we do not do explicit state-splits and function `processComparison()` 
removes contradicting branches.



================
Comment at: lib/StaticAnalyzer/Checkers/IteratorChecker.cpp:2066
            "Symbol comparison must be a comparison");
     return assumeNoOverflow(NewState, cast<SymIntExpr>(CompSym)->getLHS(), 2);
   }
----------------
NoQ wrote:
> P.S. What was the idea here? Like, `CompSym` was just computed via `BO_EQ` 
> and has type of a condition, i.e. `bool` because we are in C++. Is this code 
> trying to say that the result of the comparison is bounded by `true/2`?
There is also a `->getLHS()` which means that we enforce the bound on the 
left-hand side of the rearranged comparison. Although both symbols are bounded 
by `max/4`, constraint manager does not imply that the sum/diff is the bounded 
by `max/2`. I have to enforce this manually to prevent `min` negated to `min` 
when the constraint manager negates the difference.


Repository:
  rC Clang

https://reviews.llvm.org/D53701



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to