cxxopt/include
Dexter.k 654d63dfae
Avoid undefined std::abs(INT_MIN) in integer_parser (#498)
* Avoid undefined std::abs(INT_MIN) in integer_parser

When parsing a negative integer into a signed type whose minimum value
equals INTMAX_MIN (e.g. int64_t on typical platforms), integer_parser
computes the limit as std::abs(static_cast<intmax_t>(min())). Negating
INTMAX_MIN cannot be represented in intmax_t, so the std::abs call is
undefined behaviour. UBSan flags this on every negative int64_t parse,
including a trivial one like "-1":

  runtime error: negation of -9223372036854775808 cannot be represented
  in type 'long'; cast to an unsigned type to negate this value to itself

Build the same unsigned magnitude (|min| == max + 1 for two's-complement)
directly in the unsigned arithmetic type instead. For unsigned T the
expression wraps to 0, which matches the previous std::abs(0) value, so
behaviour for unsigned types is preserved.

* test: cover INT64_MIN parse and run parser tests under UBSan

* test: skip UBSan flags on Windows clang-cl/MinGW builds
2026-06-03 07:28:20 +10:00
..
CMakeLists.txt Cmake Revamp (#270) 2021-01-17 12:11:02 +11:00
cxxopts.hpp Avoid undefined std::abs(INT_MIN) in integer_parser (#498) 2026-06-03 07:28:20 +10:00