Commit 8d56fe68 authored by Jim Meyering's avatar Jim Meyering Committed by facebook-github-bot-0

folly/Conv.h: estimateSpaceNeeded: avoid undefined behavior

Summary: Do not negate signed numbers like INT_MIN or INTMAX_MIN, since
that would evoke undefined behavior.  Otherwise, the test (below)
would fail with this run-time error:

  [ RUN      ] Conv.Integral2String
  folly/Conv.h:521:47: runtime error: negation of -2147483648 cannot be represented in type 'int'; cast to an unsigned type to negate this value to itself

Reviewed By: markisaa

Differential Revision: D2704195

fb-gh-sync-id: 4036437fb972109672004163880078127e7df797
parent d3a08687
...@@ -513,7 +513,10 @@ typename std::enable_if< ...@@ -513,7 +513,10 @@ typename std::enable_if<
size_t>::type size_t>::type
estimateSpaceNeeded(Src value) { estimateSpaceNeeded(Src value) {
if (value < 0) { if (value < 0) {
return 1 + digits10(static_cast<uint64_t>(-value)); // When "value" is the smallest negative, negating it would evoke
// undefined behavior, so, instead of writing "-value" below, we write
// "~static_cast<uint64_t>(value) + 1"
return 1 + digits10(~static_cast<uint64_t>(value) + 1);
} }
return digits10(static_cast<uint64_t>(value)); return digits10(static_cast<uint64_t>(value));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment