NoQ added inline comments.
================ Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:340-345 + // TODO #2: We didn't go into the nested expressions before, so it + // might cause us spending much more time doing the inference. + // This can be a problem for deeply nested expressions that are + // involved in conditions and get tested continuously. We definitely + // need to address this issue and introduce some sort of caching + // in here. ---------------- xazax.hun wrote: > NoQ wrote: > > vsavchenko wrote: > > > NoQ wrote: > > > > I think this is a must-have, at least in some form. We've been > > > > exploding like this before on real-world code, well, probably not with > > > > bitwise ops but i'm still worried. > > > It will be pretty easy to introduce a limit on how deep we go into a tree > > > of the given symbolic expression. That can also be a solution. > > I mean, doing something super trivial, like defining a map from symexprs to > > ranges in `SymbolicRangeInferrer` itself and find-or-inserting into it, > > will probably not be harder than counting depth(?) > I am a bit ignorant of this topic, but I wonder what a good caching mechanism > would look like. > A simple `symexpr -> range` mapping does not feel right as the same symexpr > might have a different range in a different program state (e.g., we might > learn new ranges for our symbols). But having a separate map for each state > state might do relatively little caching? Even a simple `symexpr -> range` mapping with lifetime of `SymbolicRangeInferrer` should be able to improve algorithmic complexity dramatically. And it doesn't need to consider different states because it only lives for the duration of a single `assume()` operation. ================ Comment at: clang/test/Analysis/constant-folding.c:127-128 + if (a > 10) { + clang_analyzer_eval((a & 1) <= 1); // expected-warning{{FALSE}} + clang_analyzer_eval((a & 1) > 1); // expected-warning{{FALSE}} + } ---------------- vsavchenko wrote: > NoQ wrote: > > vsavchenko wrote: > > > NoQ wrote: > > > > How can both of these be false? o.o > > > Yeah :) I realized how weird it is. > > > Anything is possible in the land of infeasible ranges. > > > > > > I changed a comment there to address this > > I mean, this pretty much never happened before. How are you not tripping on > > [[ > > https://github.com/llvm/llvm-project/blob/1a4421a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ConstraintManager.h#L100 > > | this assert ]]? (probably it's simply been disabled in normal debug > > builds now that it's under "expensive checks") > > > > The correct thing to do is to detect the paradox earlier and mark the path > > as infeasible. What prevents us from doing it right away here? > Before we didn't really care about constraints on the operands and I changed > it :) > So, now `Intersect` (which is logically not a correct way to do what is > meant) can cause this type of behaviour [visible confusion] Could you elaborate? I see that only constraint so far is `$a: [11; UINT_MAX]`. I don't see any infeasible ranges here. `(a & 1) <= 1` is clearly true. If we were previously thinking that it's unknown and now we think that it's false, then it's a regression. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D79232/new/ https://reviews.llvm.org/D79232 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits