ASDenysPetrov added inline comments.

================
Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:1623
     if (!Constraint.containsZero()) {
-      State = RCM.assumeSymNE(State, LHS, Zero, Zero);
+      State = RCM.assumeSymRel(State, LHS, BO_NE, Zero);
       if (!State)
----------------
martong wrote:
> ASDenysPetrov wrote:
> > What I see, you're still trying to avoid using `State->assume`, which I 
> > recommend in a parent revision, but coming closer using its guts.
> So, it would look like this:
> ```
> State = State->assume(Builder.makeSymbolVal(LHS).castAs<nonloc::SymbolVal>(), 
> true);
> ```
> The main  reason why we cannot use `State->assume` is that it boils down to 
> `RangedConstraintManager::assumeSym` that has a specific logic for the 
> `boolean` assumption. I.e. the operator is being negated in a case:
> ```
>     if (BinaryOperator::isComparisonOp(op) && op != BO_Cmp) {
>       if (!Assumption)
>         op = BinaryOperator::negateComparisonOp(op);
> 
>       return assumeSymRel(State, SIE->getLHS(), op, SIE->getRHS());
>     }
> ```
> You can try it for yourself, and see that the test case added in this patch 
> will not pass if we were to use `State->assume`. Essentially, we have to 
> evade the special "bool" logic, and the closest we can get is using 
> `assumeSymRel`.
> 
> Besides that, by using `State->assume` we would have a superfluous conversion 
> chain `Symbol->SVal->Symbol` until we reach `assumeSymRel`. 
>You can try it for yourself, and see that the test case added in this patch 
>will not pass if we were to use `State->assume.`
I can't confirm. Your test case passed when I replaced with `State = 
State->assume(Builder.makeSymbolVal(LHS).castAs<nonloc::SymbolVal>(), true);`.
> specific logic for the boolean assumption. I.e. the operator is being negated 
> in a case:
That just simplifies the expression, say, you want to find whether `x > 5 is 
false`, than the Solver finds for you whether 
`x <= 5 is true`, which is an equivalent.
> Essentially, we have to evade the special "bool" logic
There is no problem with //bool// logic. It's an equivalent of `SVal != 0` when 
//true//, and `SVal == 0` when //false//. Nothing more.

All in all I see the problem to use `assume`. Not because of this function 
itself, but because you do it incorrect by getting an `SVal` from `LHS` with 
`makeSymbolVal`. We should get it with `State->getSVal` which needs 
`LocationContext` as a second parameter. And that's the challenge, to pass 
`LocationContext` here, since `RangedConstraintManager` doesn't use it, at 
least for now.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112296/new/

https://reviews.llvm.org/D112296

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

Reply via email to