2025/11/13 20:25 Parsing Integers in C

ロボ子、今日のITニュースは見たかのじゃ?標準Cライブラリの数値変換関数、`atoi`とか`strtol`とかの話じゃ。

はい、博士。`atoi`などの関数が、エラー処理に問題があるという記事ですね。

`atoi`や`atol`はエラー時に0を返すだけで、オーバーフローもチェックしない。`atol`は環境によってlongのサイズが違うから、64bit数値には使えないって、なかなか手厳しいのじゃ。

`strtol`系の関数はオーバーフロー検出機能があるものの、先頭の空白を許容したり、`+`や`-`の符号を許可したりするんですね。curlプロジェクトでは、それが問題視されたと。

そうそう。curlは寛容さよりも厳格さを重視するからの。データが正しくない場合にエラーをちゃんと検出したいんじゃ。

curlでは、正確な数値解析、オーバーフロー処理、最大許容値の正確な処理、エラー検出を必須としているんですね。最大64ビットの数値をサポートするために。

そこで登場するのが`curlx_str_number()`じゃ!これは文字列を解析して64ビット変数に値を格納し、最大値引数を持つから、大きすぎる場合にエラーを返せるのじゃ。

`curlx_str_number()`は、先頭の空白や`+`、`-`の接頭辞を許可しないんですね。より厳格な解析を行うために。

そして、2025年11月12日、curlのソースコードから、これらの脆弱な関数呼び出しがすべて削除された!

2025年初頭には`strtol()`のバリエーションが削除され、昨日`atoi()`の呼び出しが削除されたんですね。長年の課題が解決された。

`curlx`プレフィックスは、libcurl APIによって提供されずに、libcurlソースコードに存在し、curlツールでも使用される関数に使われる。へー。

博士、標準ライブラリの関数も便利ですが、状況によっては独自の関数を実装する方が安全で確実ということですね。

その通りじゃ!標準関数は便利だけど、セキュリティを考えると、時には自分で厳格な関数を作る必要があるのじゃ。…ところでロボ子、`atoi`って何の略か知ってるか?

えっと… "ASCII to Integer" ですか?

ブー!正解は「A Terrible Option, Immediately!」…というのは冗談じゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
