arduino / arduino/ArduinoCore-API

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

Ouverte
#175 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
bug
Langage dominant
C++
Étoiles
306
Forks
150
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

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](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.

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Piste de recherche

Commencez dans String.cpp, au niveau de String::toInt(), et examinez le comportement de atol() pour les valeurs en dehors de la plage long de la plateforme. Comparez le strtol() proposé et la gestion de errno sur les plateformes 8-bit et 32-bit ; l’issue est terminée lorsque les entrées trop grandes produisent des résultats cohérents et documentés sans mal gérer LONG_MAX ou LONG_MIN.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
cpp
Domaine
embedded-iot
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
48/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.