manas added inline comments.
================ Comment at: clang/test/Analysis/constant-folding.c:280-281 + if (c < 0 && c != INT_MIN && d < 0) { + clang_analyzer_eval((c + d) == -1); // expected-warning{{FALSE}} + clang_analyzer_eval((c + d) == 0); // expected-warning{{FALSE}} + clang_analyzer_eval((c + d) <= -2); // expected-warning{{UNKNOWN}} ---------------- vsavchenko wrote: > manas wrote: > > When I pull these cases out to a separate function (say testAdditionRules2) > > in constant-folding.c then algorithm is able to reason about the range > > correctly, but inside testAdditionRules, it is unable to figure stuff out. > > Does it have something to do with constraints being propagated which we > > discussed below? > > > > @vsavchenko wrote: > > > I have one note here. The fact that we don't have a testing framework > > > and use this approach of inspecting the actual analysis has an > > > interesting implication. > > > > > > ``` > > > if (a == 10) { // here we split path into 2 paths: one where a == 10, and > > > one where a != 10; > > > // one goes inside of if, one doesn't > > > . . . > > > } > > > if (a >= 5) { // here we split into 3 paths: a == 10, a < 5, and a in [5, > > > 9] and [11, INT_MAX] (aka a >= 5 and a != 10). > > > // 1 path was infeasible: a == 10 and a < 5 > > > // Two of these paths go inside of the if, one doesn't > > > . . . > > > clang_analyzer_eval(a == 10); // it will produce two results: TRUE and > > > FALSE > > > } > > > clang_analyzer_eval(a == 10); // it will produce three results: TRUE, > > > FALSE, and FALSE > > > ``` > > > > > > We don't want to test how path splitting works in these particular tests > > > (they are about solver and constant folding after all), that's why we try > > > to have only one path going through each `clang_analyzer_eval(...)` > > > > > > > > It might be that or it might be something different. Just by looking at this > example, the previous `if` statement shouldn't add more paths that go inside > of this `if`, so it shouldn't be the root cause. > Whenever you encounter problems and you want to tell other people, **please, > provide more detail**. Did you notice it when running the test case? What > was the output? What did you try? How did you extract it into a separate > function? I put a new test function in `constant-folding.c` as: ``` void testAdditionRulesNew(int c, int d) { if (c < 0 && c != INT_MIN && d < 0) { clang_analyzer_eval((c + d) == 0); // expected-warning{{FALSE}} } } ``` I tested this specific function as: ./build/bin/clang -cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyze-function=testAdditionRulesNew constant-folding.c And I got the following output: ../clang/test/Analysis/constant-folding.c:338:5: warning: FALSE [debug.ExprInspection] clang_analyzer_eval((c + d) == 0); // expected-warning{{FALSE}} which is correct. But when I ran the same test inside `testAdditionRules`, using: ./build/bin/clang -cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyze-function=testAdditionRules constant-folding.c then I got: ../clang/test/Analysis/constant-folding.c:281:5: warning: FALSE [debug.ExprInspection] clang_analyzer_eval((c + d) == 0); // expected-warning{{FALSE}} ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../clang/test/Analysis/constant-folding.c:281:5: warning: TRUE [debug.ExprInspection] clang_analyzer_eval((c + d) == 0); // expected-warning{{FALSE}} ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Here, `c = [INT_MIN + 1, -1]` and `d = [INT_MIN, 0]`, so `c + d = [INT_MIN, -2] U [1, INT_MAX]`. So `c + d == 0` should be false. But in latter case, it is reasoning `c + d == 0` to be `UNKNOWN`. Also, the error arises in `c + d == 0` case only and not in `c + d == -1` case. I mistakenly highlighted that case while commenting. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D103440/new/ https://reviews.llvm.org/D103440 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits