arduino / arduino/ArduinoCore-API

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

オープン
#175 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
bug
主要言語
C++
スター
306
フォーク
150
PR マージ指標
30日以内にマージされた PR はありません

説明

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.

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

調査の方向性

String.cpp の String::toInt() から始め、プラットフォームの long の範囲外の値に対して atol() がどのように動作するかを確認します。8-bit および 32-bit プラットフォーム全体で、提案されている strtol() と errno の処理を比較します。範囲を超える入力が、LONG_MAX や LONG_MIN を誤って扱うことなく、一貫した文書化済みの結果を生成すれば、issue は完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
cpp
領域
embedded-iot
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
48/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。