[PATCH] D103094: [analyzer] Implemented RangeSet::Factory::castTo function to perform promotions, truncations and conversions.

Valeriy Savchenko via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 23 07:47:05 PDT 2021


vsavchenko added inline comments.


================
Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:297-307
+bool clang::ento::RangeSet::isUnsigned() const {
+  return begin()->From().isUnsigned();
+}
+
+uint32_t clang::ento::RangeSet::getBitWidth() const {
+  return begin()->From().getBitWidth();
+}
----------------
We should add `assert(!isEmpty());` in all three


================
Comment at: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp:645-676
+    // CastRangeSize is an amount of all possible values of cast type.
+    // Example: `char` has 256 values; `short` has 65536 values.
+    // But in fact we use `amount of values` - 1, because
+    // we can't keep `amount of values of UINT64` inside uint64_t.
+    // E.g. 256 is an amount of all possible values of `char` and we can't keep
+    // it inside `char`.
+    // And it's OK, it's enough to do correct calculations.
----------------
Maybe we can extract this into something like `truncateTo` and the next `if` to `convertTo` private methods?


================
Comment at: clang/unittests/StaticAnalyzer/RangeSetTest.cpp:117-118
+  template <typename T>
+  static constexpr APSIntType APSIntTy = APSIntType(sizeof(T) * 8,
+                                                    !is_signed_v<T>);
+
----------------
Great, that works too!


================
Comment at: clang/unittests/StaticAnalyzer/RangeSetTest.cpp:120
+
+  template <typename T> const llvm::APSInt &from(T X) {
+    static llvm::APSInt Int = APSIntTy<T>.getZeroValue();
----------------
Default to `BaseType`?


================
Comment at: clang/unittests/StaticAnalyzer/RangeSetTest.cpp:126
 
-  Range from(const RawRange &Init) {
+  template <typename T> Range from(const RawRangeT<T> &Init) {
     return Range(from(Init.first), from(Init.second));
----------------
Default to `BaseType`?


================
Comment at: clang/unittests/StaticAnalyzer/RangeSetTest.cpp:130
 
-  RangeSet from(const RawRangeSet &Init) {
+  template <typename T>
+  RangeSet from(RawRangeSetT<T> Init, APSIntType Ty = APSIntTy<BaseType>) {
----------------
Default to `BaseType`?


================
Comment at: clang/unittests/StaticAnalyzer/RangeSetTest.cpp:131
+  template <typename T>
+  RangeSet from(RawRangeSetT<T> Init, APSIntType Ty = APSIntTy<BaseType>) {
     RangeSet RangeSet = F.getEmptySet();
----------------
Unused parameter?


================
Comment at: clang/unittests/StaticAnalyzer/RangeSetTest.cpp:721-799
+TYPED_TEST(RangeSetCastToNoopTest, RangeSetCastToNoopTest) {
+  // Just to reduce the verbosity.
+  using F = typename TypeParam::FromType; // From
+  using T = typename TypeParam::ToType;   // To
+
+  using TV = TestValues<T>;
+  constexpr auto MIN = TV::MIN;
----------------
If loop and promotion share the same test case, why should we split them into two groups?


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

https://reviews.llvm.org/D103094



More information about the cfe-commits mailing list