aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEnilPajic <epajic1@etf.unsa.ba>2020-06-26 21:25:39 +0200
committerGitHub <noreply@github.com>2020-06-26 21:25:39 +0200
commit5baf5d3daeece33e0767a1c8fbd1b85daa84f45e (patch)
treed6111dbdb6ab84514182b182d92639d5ec838b9a
parent2be778931d2029c3ff121023e5c2c217f69e61d5 (diff)
Fixed potential bug with -MINIMUM_VALUE
Original code had something like `N < 0 ? -N : N` which could fail if `N` has minimum value of appropriate type. For example, in original code this could fail: ```cpp const long long int LL_MIN = std::numeric_limits<long long int>::min(); //probably: -9223372036854775808 static const char *number = to_string<LL_MIN, 10>; ``` Also note that this code relies on "modulo on negative first operands" which was implementation defined in C++03 and before, but with C++11 and later it is defined by standard (see `ISO14882:2011(e)`), and this code anyway targets C++17 so we're safe here.
-rw-r--r--to_string.hpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/to_string.hpp b/to_string.hpp
index 116cdd8..6117258 100644
--- a/to_string.hpp
+++ b/to_string.hpp
@@ -23,7 +23,7 @@ struct to_string_t {
// fits to the number perfectly.
char buf[([] {
unsigned int len = N >= 0 ? 1 : 2;
- for (auto n = N < 0 ? -N : N; n; len++, n /= base);
+ for (auto n = N; n; len++, n /= base);
return len;
}())];
@@ -33,8 +33,8 @@ struct to_string_t {
constexpr to_string_t() {
auto ptr = buf + sizeof(buf) / sizeof(buf[0]);
*--ptr = '\0';
- for (auto n = N < 0 ? -N : N; n; n /= base)
- *--ptr = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[n % base];
+ for (auto n = N; n; n /= base)
+ *--ptr = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[(N < 0 ? -1 : 1) * (n % base)];
if (N < 0)
*--ptr = '-';
}