[PATCH] D110357: [Analyzer] Extend ConstraintAssignor to handle remainder op

Balázs Benics via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 27 01:39:15 PDT 2021


steakhal added a comment.

Great work!



================
Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:1591-1595
   template <class ClassOrSymbol>
   LLVM_NODISCARD static ProgramStateRef
-  assign(ProgramStateRef State, SValBuilder &Builder, RangeSet::Factory &F,
-         ClassOrSymbol CoS, RangeSet NewConstraint) {
+  assign(ProgramStateRef State, RangeConstraintManager *RCM,
+         SValBuilder &Builder, RangeSet::Factory &F, ClassOrSymbol CoS,
+         RangeSet NewConstraint) {
----------------
Hm, why don't we acquire `RCM`, `Builder`, `F` in the constructor? I'm expecting all of them to remain the same for all the `assign()` calls.


================
Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:1603-1604
 
+  template <typename SymT>
+  bool handleRem(const SymT *Sym, RangeSet Constraint) {
+    // a % b != 0 implies that a != 0.
----------------
Why is this not a `const` member function?


================
Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:1605
+  bool handleRem(const SymT *Sym, RangeSet Constraint) {
+    // a % b != 0 implies that a != 0.
+    if (Sym->getOpcode() != BO_Rem)
----------------
I think you should also implement `a % b == 0 implies that a == 0`.


================
Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:1628
 private:
-  ConstraintAssignor(ProgramStateRef State, SValBuilder &Builder,
-                     RangeSet::Factory &F)
-      : State(State), Builder(Builder), RangeFactory(F) {}
+  ConstraintAssignor(ProgramStateRef State, RangeConstraintManager *RCM,
+                     SValBuilder &Builder, RangeSet::Factory &F)
----------------
IMO we should pass a reference here, just like the rest of the parameters.


================
Comment at: clang/test/Analysis/constraint-assignor.c:18
+  clang_analyzer_warnIfReached(); // no-warning
+  (void)x; // keep the constraints alive.
+}
----------------
It's still mindboggling that we need to do this. 


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D110357



More information about the cfe-commits mailing list