martong added a comment.

> The motivation is to extend the set of operations that can be performed on 
> range sets. Specifically, this function is needed for the next patch in the 
> stack.

Would be great to see the motivation clearly and early. What will be the next 
patch about?



================
Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:711
 
+RangeSet RangeSet::Factory::invert(RangeSet What) {
+  assert(!What.isEmpty());
----------------
Could you please document this function and its complexity? (O(N) where N is 
the number of elements of the RangeSet.)


================
Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:728-729
+  ContainerType Result;
+  Result.reserve(What.size() + 1 - bool(What.getMinValue() != MIN) -
+                 bool(What.getMaxValue() != MAX));
+
----------------
There might be a flaw here. Should this be `==` instead of `!=` ?
Consider e.g. when `What` has two elements `[[MIN, -1], [1, MAX]]` then the 
inverse should be `[0,0]` which has size `1`.


================
Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:734-735
+
+  if (It->From() == MIN)
+    goto loop;
+
----------------
No `goto` please. There are better alternatives, e.g. you could have two 
different `while` loops for each cases.


================
Comment at: clang/unittests/StaticAnalyzer/RangeSetTest.cpp:281
+    RangeSet Result = F.invert(What);
+    EXPECT_EQ(Result, Expected) << "while inverting " << toString(What);
+  }
----------------
I think, it would make sense to test the composition of two invert operations 
to identity. 
```
EXPECT_EQ(What, F.invert(F.invert(What));
```
This, of course requires that empty set is a possible input.


================
Comment at: clang/unittests/StaticAnalyzer/RangeSetTest.cpp:1101
 
+TYPED_TEST(RangeSetTest, RangeSetInvertTest) {
+  using TV = TestValues<TypeParam>;
----------------
Good tests!


================
Comment at: clang/unittests/StaticAnalyzer/RangeSetTest.cpp:1130
+  // Check inverting single range.
+  this->checkInvert({{MIN, MAX}}, {});
+  this->checkInvert({{MIN, MID}}, {{MID + 1, MAX}});
----------------
I'd expect that inversion on finite sets is an invert-able function thus
```
this->checkInvert({}, {MIN, MAX});
```
would make sense instead of assertion.

Besides, it would make sense to test the composition of two invert operations 
to identity. 


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D130372

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

Reply via email to