[libc-commits] [libc] [libc] Fix improper initialization of `StorageType` (PR #75610)

via libc-commits libc-commits at lists.llvm.org
Fri Dec 15 06:04:25 PST 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libc

Author: Guillaume Chatelet (gchatelet)

<details>
<summary>Changes</summary>

`StorageType` may be a `BigInt` under the hood. Initializing it with `-1` does not yields the maximum value.


---
Full diff: https://github.com/llvm/llvm-project/pull/75610.diff


23 Files Affected:

- (modified) libc/test/UnitTest/FPMatcher.h (+5) 
- (modified) libc/test/src/math/CeilTest.h (+1-1) 
- (modified) libc/test/src/math/CopySignTest.h (+1-1) 
- (modified) libc/test/src/math/FAbsTest.h (+1-1) 
- (modified) libc/test/src/math/FDimTest.h (+4-2) 
- (modified) libc/test/src/math/FMaxTest.h (+2-2) 
- (modified) libc/test/src/math/FMinTest.h (+2-2) 
- (modified) libc/test/src/math/FloorTest.h (+1-1) 
- (modified) libc/test/src/math/FrexpTest.h (+1-1) 
- (modified) libc/test/src/math/LogbTest.h (+1-1) 
- (modified) libc/test/src/math/ModfTest.h (+1-1) 
- (modified) libc/test/src/math/RoundTest.h (+1-1) 
- (modified) libc/test/src/math/SqrtTest.h (+1-1) 
- (modified) libc/test/src/math/TruncTest.h (+1-1) 
- (modified) libc/test/src/math/cos_test.cpp (+1-1) 
- (modified) libc/test/src/math/sin_test.cpp (+1-1) 
- (modified) libc/test/src/math/smoke/CopySignTest.h (+1-1) 
- (modified) libc/test/src/math/smoke/FDimTest.h (+4-2) 
- (modified) libc/test/src/math/smoke/FMaxTest.h (+2-2) 
- (modified) libc/test/src/math/smoke/FMinTest.h (+2-2) 
- (modified) libc/test/src/math/smoke/LogbTest.h (+1-1) 
- (modified) libc/test/src/math/smoke/ModfTest.h (+1-1) 
- (modified) libc/test/src/math/tan_test.cpp (+1-1) 


``````````diff
diff --git a/libc/test/UnitTest/FPMatcher.h b/libc/test/UnitTest/FPMatcher.h
index a3b776493fe2c4..003de7eb72ac8e 100644
--- a/libc/test/UnitTest/FPMatcher.h
+++ b/libc/test/UnitTest/FPMatcher.h
@@ -9,6 +9,7 @@
 #ifndef LLVM_LIBC_UTILS_UNITTEST_FPMATCHER_H
 #define LLVM_LIBC_UTILS_UNITTEST_FPMATCHER_H
 
+#include "src/__support/CPP/type_traits.h"
 #include "src/__support/FPUtil/FEnvImpl.h"
 #include "src/__support/FPUtil/FPBits.h"
 #include "src/__support/FPUtil/fpbits_str.h"
@@ -62,6 +63,8 @@ template <TestCond C, typename T> FPMatcher<T, C> getMatcher(T expectedValue) {
 template <typename T> struct FPTest : public Test {
   using FPBits = LIBC_NAMESPACE::fputil::FPBits<T>;
   using StorageType = typename FPBits::StorageType;
+  static constexpr StorageType STORAGE_MAX =
+      LIBC_NAMESPACE::cpp::numeric_limits<StorageType>::max();
   static constexpr T zero = FPBits::zero();
   static constexpr T neg_zero = FPBits::neg_zero();
   static constexpr T aNaN = FPBits::build_quiet_nan(1);
@@ -88,6 +91,8 @@ template <typename T> struct FPTest : public Test {
 #define DECLARE_SPECIAL_CONSTANTS(T)                                           \
   using FPBits = LIBC_NAMESPACE::fputil::FPBits<T>;                            \
   using StorageType = typename FPBits::StorageType;                            \
+  static constexpr StorageType STORAGE_MAX =                                   \
+      LIBC_NAMESPACE::cpp::numeric_limits<StorageType>::max();                 \
   const T zero = FPBits::zero();                                               \
   const T neg_zero = FPBits::neg_zero();                                       \
   const T aNaN = FPBits::build_quiet_nan(1);                                   \
diff --git a/libc/test/src/math/CeilTest.h b/libc/test/src/math/CeilTest.h
index c8b10e86479e83..67b33cb14110bc 100644
--- a/libc/test/src/math/CeilTest.h
+++ b/libc/test/src/math/CeilTest.h
@@ -65,7 +65,7 @@ template <typename T> class CeilTest : public LIBC_NAMESPACE::testing::Test {
 
   void testRange(CeilFunc func) {
     constexpr StorageType COUNT = 100'000;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
     for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
       T x = T(FPBits(v));
       if (isnan(x) || isinf(x))
diff --git a/libc/test/src/math/CopySignTest.h b/libc/test/src/math/CopySignTest.h
index fe0b5855c5be2f..c916416a2e5b91 100644
--- a/libc/test/src/math/CopySignTest.h
+++ b/libc/test/src/math/CopySignTest.h
@@ -35,7 +35,7 @@ class CopySignTest : public LIBC_NAMESPACE::testing::Test {
 
   void testRange(CopySignFunc func) {
     constexpr StorageType COUNT = 100'000;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
     for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
       T x = T(FPBits(v));
       if (isnan(x) || isinf(x))
diff --git a/libc/test/src/math/FAbsTest.h b/libc/test/src/math/FAbsTest.h
index e4009d2a3df5f3..b2b146167e6252 100644
--- a/libc/test/src/math/FAbsTest.h
+++ b/libc/test/src/math/FAbsTest.h
@@ -33,7 +33,7 @@ template <typename T> class FAbsTest : public LIBC_NAMESPACE::testing::Test {
 
   void testRange(FabsFunc func) {
     constexpr StorageType COUNT = 100'000;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
     for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
       T x = T(FPBits(v));
       if (isnan(x) || isinf(x))
diff --git a/libc/test/src/math/FDimTest.h b/libc/test/src/math/FDimTest.h
index 5bca63604b0f55..e926640abc90e0 100644
--- a/libc/test/src/math/FDimTest.h
+++ b/libc/test/src/math/FDimTest.h
@@ -53,9 +53,11 @@ class FDimTestTemplate : public LIBC_NAMESPACE::testing::Test {
   }
 
   void test_in_range(FuncPtr func) {
+    constexpr StorageType STORAGE_MAX =
+        LIBC_NAMESPACE::cpp::numeric_limits<StorageType>::max();
     constexpr StorageType COUNT = 100'001;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
-    for (StorageType i = 0, v = 0, w = StorageType(-1); i <= COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
+    for (StorageType i = 0, v = 0, w = STORAGE_MAX; i <= COUNT;
          ++i, v += STEP, w -= STEP) {
       T x = T(FPBits(v)), y = T(FPBits(w));
       if (isnan(x) || isinf(x))
diff --git a/libc/test/src/math/FMaxTest.h b/libc/test/src/math/FMaxTest.h
index c62d15c53d1e94..1a1d2a77268d1c 100644
--- a/libc/test/src/math/FMaxTest.h
+++ b/libc/test/src/math/FMaxTest.h
@@ -56,8 +56,8 @@ template <typename T> class FMaxTest : public LIBC_NAMESPACE::testing::Test {
 
   void testRange(FMaxFunc func) {
     constexpr StorageType COUNT = 100'001;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
-    for (StorageType i = 0, v = 0, w = StorageType(-1); i <= COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
+    for (StorageType i = 0, v = 0, w = STORAGE_MAX; i <= COUNT;
          ++i, v += STEP, w -= STEP) {
       T x = T(FPBits(v)), y = T(FPBits(w));
       if (isnan(x) || isinf(x))
diff --git a/libc/test/src/math/FMinTest.h b/libc/test/src/math/FMinTest.h
index ac37d14825c620..742bb5cdd1021b 100644
--- a/libc/test/src/math/FMinTest.h
+++ b/libc/test/src/math/FMinTest.h
@@ -56,8 +56,8 @@ template <typename T> class FMinTest : public LIBC_NAMESPACE::testing::Test {
 
   void testRange(FMinFunc func) {
     constexpr StorageType COUNT = 100'001;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
-    for (StorageType i = 0, v = 0, w = StorageType(-1); i <= COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
+    for (StorageType i = 0, v = 0, w = STORAGE_MAX; i <= COUNT;
          ++i, v += STEP, w -= STEP) {
       T x = T(FPBits(v)), y = T(FPBits(w));
       if (isnan(x) || isinf(x))
diff --git a/libc/test/src/math/FloorTest.h b/libc/test/src/math/FloorTest.h
index 95fc7313f843ef..c1b05c5d130834 100644
--- a/libc/test/src/math/FloorTest.h
+++ b/libc/test/src/math/FloorTest.h
@@ -65,7 +65,7 @@ template <typename T> class FloorTest : public LIBC_NAMESPACE::testing::Test {
 
   void testRange(FloorFunc func) {
     constexpr StorageType COUNT = 100'000;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
     for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
       T x = T(FPBits(v));
       if (isnan(x) || isinf(x))
diff --git a/libc/test/src/math/FrexpTest.h b/libc/test/src/math/FrexpTest.h
index 8fbb4bf1f0b638..0e66bd5804d58c 100644
--- a/libc/test/src/math/FrexpTest.h
+++ b/libc/test/src/math/FrexpTest.h
@@ -95,7 +95,7 @@ template <typename T> class FrexpTest : public LIBC_NAMESPACE::testing::Test {
   void testRange(FrexpFunc func) {
     using StorageType = typename FPBits::StorageType;
     constexpr StorageType COUNT = 100'000;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
     for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
       T x = static_cast<T>(FPBits(v));
       if (isnan(x) || isinf(x) || x == 0.0l)
diff --git a/libc/test/src/math/LogbTest.h b/libc/test/src/math/LogbTest.h
index be330e861efb24..2049c8ffe950ee 100644
--- a/libc/test/src/math/LogbTest.h
+++ b/libc/test/src/math/LogbTest.h
@@ -74,7 +74,7 @@ template <typename T> class LogbTest : public LIBC_NAMESPACE::testing::Test {
   void testRange(LogbFunc func) {
     using StorageType = typename FPBits::StorageType;
     constexpr StorageType COUNT = 100'000;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
     for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
       T x = static_cast<T>(FPBits(v));
       if (isnan(x) || isinf(x) || x == 0.0l)
diff --git a/libc/test/src/math/ModfTest.h b/libc/test/src/math/ModfTest.h
index f9dbeb99b7dbd2..f5196a74fa7425 100644
--- a/libc/test/src/math/ModfTest.h
+++ b/libc/test/src/math/ModfTest.h
@@ -85,7 +85,7 @@ template <typename T> class ModfTest : public LIBC_NAMESPACE::testing::Test {
 
   void testRange(ModfFunc func) {
     constexpr StorageType COUNT = 100'000;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
     for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
       T x = T(FPBits(v));
       if (isnan(x) || isinf(x) || x == T(0.0))
diff --git a/libc/test/src/math/RoundTest.h b/libc/test/src/math/RoundTest.h
index a0e7085ffc9eaa..3ec46159c65d95 100644
--- a/libc/test/src/math/RoundTest.h
+++ b/libc/test/src/math/RoundTest.h
@@ -65,7 +65,7 @@ template <typename T> class RoundTest : public LIBC_NAMESPACE::testing::Test {
 
   void testRange(RoundFunc func) {
     constexpr StorageType COUNT = 100'000;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
     for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
       T x = T(FPBits(v));
       if (isnan(x) || isinf(x))
diff --git a/libc/test/src/math/SqrtTest.h b/libc/test/src/math/SqrtTest.h
index e5a4e5fc562b3f..2cfe401c5542a3 100644
--- a/libc/test/src/math/SqrtTest.h
+++ b/libc/test/src/math/SqrtTest.h
@@ -56,7 +56,7 @@ template <typename T> class SqrtTest : public LIBC_NAMESPACE::testing::Test {
 
   void test_normal_range(SqrtFunc func) {
     constexpr StorageType COUNT = 200'001;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
     for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
       T x = LIBC_NAMESPACE::cpp::bit_cast<T>(v);
       if (isnan(x) || (x < 0)) {
diff --git a/libc/test/src/math/TruncTest.h b/libc/test/src/math/TruncTest.h
index c353ac0e914739..2be40790258ef7 100644
--- a/libc/test/src/math/TruncTest.h
+++ b/libc/test/src/math/TruncTest.h
@@ -65,7 +65,7 @@ template <typename T> class TruncTest : public LIBC_NAMESPACE::testing::Test {
 
   void testRange(TruncFunc func) {
     constexpr StorageType COUNT = 100'000;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
     for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
       T x = T(FPBits(v));
       if (isnan(x) || isinf(x))
diff --git a/libc/test/src/math/cos_test.cpp b/libc/test/src/math/cos_test.cpp
index add4e2b39f3ca5..a4c332bc7fb52b 100644
--- a/libc/test/src/math/cos_test.cpp
+++ b/libc/test/src/math/cos_test.cpp
@@ -20,7 +20,7 @@ namespace mpfr = LIBC_NAMESPACE::testing::mpfr;
 TEST_F(LlvmLibcCosTest, Range) {
   static constexpr double _2pi = 6.283185307179586;
   constexpr StorageType COUNT = 100'000;
-  constexpr StorageType STEP = StorageType(-1) / COUNT;
+  constexpr StorageType STEP = STORAGE_MAX / COUNT;
   for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
     double x = double(FPBits(v));
     // TODO: Expand the range of testing after range reduction is implemented.
diff --git a/libc/test/src/math/sin_test.cpp b/libc/test/src/math/sin_test.cpp
index 8bd8f52c90ee02..cd9eeaff598fea 100644
--- a/libc/test/src/math/sin_test.cpp
+++ b/libc/test/src/math/sin_test.cpp
@@ -21,7 +21,7 @@ namespace mpfr = LIBC_NAMESPACE::testing::mpfr;
 TEST_F(LlvmLibcSinTest, Range) {
   static constexpr double _2pi = 6.283185307179586;
   constexpr StorageType COUNT = 100'000;
-  constexpr StorageType STEP = StorageType(-1) / COUNT;
+  constexpr StorageType STEP = STORAGE_MAX / COUNT;
   for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
     double x = double(FPBits(v));
     // TODO: Expand the range of testing after range reduction is implemented.
diff --git a/libc/test/src/math/smoke/CopySignTest.h b/libc/test/src/math/smoke/CopySignTest.h
index cb82d59783ac1b..1108a45ae673e5 100644
--- a/libc/test/src/math/smoke/CopySignTest.h
+++ b/libc/test/src/math/smoke/CopySignTest.h
@@ -32,7 +32,7 @@ class CopySignTest : public LIBC_NAMESPACE::testing::Test {
 
   void testRange(CopySignFunc func) {
     constexpr StorageType COUNT = 100'000;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
     for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
       FPBits x_bits = FPBits(v);
       T x = T(v);
diff --git a/libc/test/src/math/smoke/FDimTest.h b/libc/test/src/math/smoke/FDimTest.h
index 5bca63604b0f55..e926640abc90e0 100644
--- a/libc/test/src/math/smoke/FDimTest.h
+++ b/libc/test/src/math/smoke/FDimTest.h
@@ -53,9 +53,11 @@ class FDimTestTemplate : public LIBC_NAMESPACE::testing::Test {
   }
 
   void test_in_range(FuncPtr func) {
+    constexpr StorageType STORAGE_MAX =
+        LIBC_NAMESPACE::cpp::numeric_limits<StorageType>::max();
     constexpr StorageType COUNT = 100'001;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
-    for (StorageType i = 0, v = 0, w = StorageType(-1); i <= COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
+    for (StorageType i = 0, v = 0, w = STORAGE_MAX; i <= COUNT;
          ++i, v += STEP, w -= STEP) {
       T x = T(FPBits(v)), y = T(FPBits(w));
       if (isnan(x) || isinf(x))
diff --git a/libc/test/src/math/smoke/FMaxTest.h b/libc/test/src/math/smoke/FMaxTest.h
index 8de21a7ba2585b..372d9c5571d319 100644
--- a/libc/test/src/math/smoke/FMaxTest.h
+++ b/libc/test/src/math/smoke/FMaxTest.h
@@ -53,8 +53,8 @@ template <typename T> class FMaxTest : public LIBC_NAMESPACE::testing::Test {
 
   void testRange(FMaxFunc func) {
     constexpr StorageType COUNT = 100'001;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
-    for (StorageType i = 0, v = 0, w = StorageType(-1); i <= COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
+    for (StorageType i = 0, v = 0, w = STORAGE_MAX; i <= COUNT;
          ++i, v += STEP, w -= STEP) {
       T x = T(FPBits(v)), y = T(FPBits(w));
       if (isnan(x) || isinf(x))
diff --git a/libc/test/src/math/smoke/FMinTest.h b/libc/test/src/math/smoke/FMinTest.h
index a6e3c78d85caff..a51f30803ba82a 100644
--- a/libc/test/src/math/smoke/FMinTest.h
+++ b/libc/test/src/math/smoke/FMinTest.h
@@ -53,8 +53,8 @@ template <typename T> class FMinTest : public LIBC_NAMESPACE::testing::Test {
 
   void testRange(FMinFunc func) {
     constexpr StorageType COUNT = 100'001;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
-    for (StorageType i = 0, v = 0, w = StorageType(-1); i <= COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
+    for (StorageType i = 0, v = 0, w = STORAGE_MAX; i <= COUNT;
          ++i, v += STEP, w -= STEP) {
       T x = T(FPBits(v)), y = T(FPBits(w));
       if (isnan(x) || isinf(x))
diff --git a/libc/test/src/math/smoke/LogbTest.h b/libc/test/src/math/smoke/LogbTest.h
index 1359bf8c81313e..a0a01a885c1041 100644
--- a/libc/test/src/math/smoke/LogbTest.h
+++ b/libc/test/src/math/smoke/LogbTest.h
@@ -71,7 +71,7 @@ template <typename T> class LogbTest : public LIBC_NAMESPACE::testing::Test {
   void testRange(LogbFunc func) {
     using StorageType = typename FPBits::StorageType;
     constexpr StorageType COUNT = 100'000;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
     for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
       T x = static_cast<T>(FPBits(v));
       if (isnan(x) || isinf(x) || x == 0.0l)
diff --git a/libc/test/src/math/smoke/ModfTest.h b/libc/test/src/math/smoke/ModfTest.h
index b0a2aed9df57d2..ea7e36b67d11fa 100644
--- a/libc/test/src/math/smoke/ModfTest.h
+++ b/libc/test/src/math/smoke/ModfTest.h
@@ -82,7 +82,7 @@ template <typename T> class ModfTest : public LIBC_NAMESPACE::testing::Test {
 
   void testRange(ModfFunc func) {
     constexpr StorageType COUNT = 100'000;
-    constexpr StorageType STEP = StorageType(-1) / COUNT;
+    constexpr StorageType STEP = STORAGE_MAX / COUNT;
     for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
       T x = T(FPBits(v));
       if (isnan(x) || isinf(x) || x == T(0.0))
diff --git a/libc/test/src/math/tan_test.cpp b/libc/test/src/math/tan_test.cpp
index ab88e8eb7199dd..8fae425f96f8f2 100644
--- a/libc/test/src/math/tan_test.cpp
+++ b/libc/test/src/math/tan_test.cpp
@@ -20,7 +20,7 @@ namespace mpfr = LIBC_NAMESPACE::testing::mpfr;
 TEST_F(LlvmLibcTanTest, Range) {
   static constexpr double _2pi = 6.283185307179586;
   constexpr StorageType COUNT = 100'000;
-  constexpr StorageType STEP = StorageType(-1) / COUNT;
+  constexpr StorageType STEP = STORAGE_MAX / COUNT;
   for (StorageType i = 0, v = 0; i <= COUNT; ++i, v += STEP) {
     double x = double(FPBits(v));
     // TODO: Expand the range of testing after range reduction is implemented.

``````````

</details>


https://github.com/llvm/llvm-project/pull/75610


More information about the libc-commits mailing list