ArduinoCore-API icon indicating copy to clipboard operation
ArduinoCore-API copied to clipboard

String::toInt() and atol() behave different on different platforms with a number that is too large.

Open Koepel opened this issue 3 years ago • 0 comments

User axemaster found strange behavior when using String::toInt() with a number that is too large. See the topic in the Arduino forum: https://forum.arduino.cc/t/toint-bug-how-unfortunate/1041669. The result is different for 8-bit and 32-bit platforms. It was narrowed down to the undefined behaviour of atol() when a number is too large to fit in a long.

The atol() in String::toInt() in String.cpp could be replaced by strtol() followed by a check for LONG_MAX or LONG_MIN and return zero if that happens. The documentation can stay as it is, because it will return a long, and zero if something is wrong. To allow LONG_MAX and LONG_MIN as valid input numbers, the errno has to be used. I don't know how that will hold up in a multitasking environment.

Koepel avatar Oct 14 '22 18:10 Koepel