vsavchenko marked 8 inline comments as done.
vsavchenko added inline comments.


================
Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:506
+  APSIntType Type(Int);
+  return Int == Type.getZeroValue();
+}
----------------
xazax.hun wrote:
> Does the semantics if this differ from ` llvm::APInt::isNullValue`?
Good catch!


================
Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:1254
+    //       sufficient.
+    return S1->get<ConstraintRange>() == S2->get<ConstraintRange>() &&
+           S1->get<ClassMap>() == S2->get<ClassMap>();
----------------
xazax.hun wrote:
> xazax.hun wrote:
> > Sorry, but I am a bit confused here.
> > 
> > Does `haveEqualConstraints` have anything to do with equivalence classes?
> > 
> > I.e., what if I have two symbols with the same constraints (but those two 
> > symbols were never compared).
> > ```
> > void f(int a, int b) {
> >   int c = clamp(a, 5, 10);
> >   int d = clamp(b, 5, 10);
> > }
> > ```
> > 
> > In the code above if analyzer understands clamp, the range for `c` and `d` 
> > will be the same. Even though we never really compared them.
> > I would expect `haveEqualConstraints` to return true, even if they do not 
> > belong to the same equivalence class.
> > 
> > Do I miss something?
> Never mind, I misunderstood this function. It operates on program states not 
> on symbols.
Nothing to be sorry about, I'm happy to clarify!

`haveEqualConstraints` is here for our join heuristic that helps removing 
duplicating paths.


================
Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:1380
 
+ConstraintMap ento::getConstraintMap(ProgramStateRef State) {
+  ConstraintMap::Factory &F = State->get_context<ConstraintMap>();
----------------
xazax.hun wrote:
> So we basically do a conversion to Symbol -> Ranges from Class -> Ranges.
> I wonder if it is possible to get rid of this conversion in the future to get 
> some performance benefits.
> We could either make all code work with both kind of range maps or have 
> something like (Symbol + Class) -> Ranges to avoid conversion.
> What do you think?
> 
> I am not opposed to this code at the moment, I just wonder if there is a 
> relatively low hanging fruit for some performance gains in the future.
This is here only for a very specific mode - when we double check found 
warnings with Z3.  That mode needs constraints assigned to symbols, so here we 
construct such a set on-the-fly.  So, we store ALL of the ranges in the map 
Class -> Ranges and construct Symbol -> Ranges on very special occasions.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D82445



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

Reply via email to