]> granicus.if.org Git - icu/commitdiff
ICU-13246 Changing util64_pow to work on uint64_t to fix signed integer overflow...
authorShane Carr <shane@unicode.org>
Sat, 17 Jun 2017 00:48:17 +0000 (00:48 +0000)
committerShane Carr <shane@unicode.org>
Sat, 17 Jun 2017 00:48:17 +0000 (00:48 +0000)
X-SVN-Rev: 40174

icu4c/source/i18n/nfrs.cpp
icu4c/source/i18n/nfrs.h

index 05941e8b2934b63c54f5c23902eb59f46fbabc26..74ce27a401a069f0c7d9339d407d1d0fd1b6ef2f 100644 (file)
@@ -830,12 +830,12 @@ int64_t util64_fromDouble(double d) {
     return result;
 }
 
-int64_t util64_pow(int32_t base, uint16_t exponent)  { 
+uint64_t util64_pow(uint32_t base, uint16_t exponent)  { 
     if (base == 0) {
         return 0;
     }
-    int64_t result = 1;
-    int64_t pow = base;
+    uint64_t result = 1;
+    uint64_t pow = base;
     while (exponent > 0) { 
         if ((exponent & 1) == 1) { 
             result *= pow; 
@@ -1027,4 +1027,3 @@ U_NAMESPACE_END
 
 /* U_HAVE_RBNF */
 #endif
-
index d28c29c1be39fcedb05e4d8f1a3c41525129910e..1e39b289b4dd2fb3b15821c368c42641d2745162 100644 (file)
@@ -88,7 +88,9 @@ private:
 int64_t util64_fromDouble(double d);
 
 // raise radix to the power exponent, only non-negative exponents
-int64_t util64_pow(int32_t radix, uint16_t exponent);
+// Arithmetic is performed in unsigned space since overflow in
+// signed space is undefined behavior.
+uint64_t util64_pow(uint32_t radix, uint16_t exponent);
 
 // convert n to digit string in buffer, return length of string
 uint32_t util64_tou(int64_t n, UChar* buffer, uint32_t buflen, uint32_t radix = 10, UBool raw = FALSE);
@@ -107,4 +109,3 @@ U_NAMESPACE_END
 
 // NFRS_H
 #endif
-