まず、私が説明している問題がどのように、そしてなぜ起こるかを理解していると言わせてください。私はコンピュータ サイエンスを専攻しており、オーバーフロー/アンダーフローと符号付き/符号なしの算術演算を理解しています。(このトピックに慣れていない人のために、Apple のセキュア コーディング ガイドでは、整数オーバーフローについて簡単に説明しています。)
私の質問は、そのようなエラーが検出された後の報告と回復についてです。より具体的には、Objective-C フレームワークの場合です。(私はCHDataStructuresを作成して維持しています。) オブジェクトを格納するためのメモリを割り当て、必要に応じて動的に拡張するコレクション クラスがいくつかあります。オーバーフローに関連するクラッシュはまだ見たことがありません。これはおそらく、私のテスト ケースでほとんど正常なデータが使用されているためです。ただし、検証されていない値が与えられると、物事はかなり急速に爆発する可能性があり、それを防ぎたい.
これが発生する一般的なケースを少なくとも2 つ特定しました。
- 呼び出し元が、非常に大きな符号なし値 (または負の符号付き値) を に渡します
-initWithCapacity:
。 - 容量を動的に拡張するのに十分な数のオブジェクトが追加され、容量がオーバーフローを引き起こすほど大きくなりました。
簡単な部分は、オーバーフローが発生するかどうかを検出することです。(たとえば、length * sizeof(void*)
バイトを割り当てようとする前にlength <= UINT_MAX / sizeof(void*)
、このテストに失敗すると、製品がオーバーフローし、必要なよりもはるかに小さいメモリ領域が割り当てられる可能性があることを意味するため、チェックすることができます。それをサポートするプラットフォームでは、checkint.h APIは別の選択肢があります。) より難しい部分は、それを適切に処理する方法を決定することです。最初のシナリオでは、発信者の方が障害に対処するための準備が整っている (または少なくとも考え方が整っている) 可能性があります。2 番目のシナリオは、オブジェクトがコレクションに追加されるコード内の任意の場所で発生する可能性があり、これはまったく決定論的ではない可能性があります。
それでは、私の質問は次のとおりです。このような状況で整数オーバーフローが発生した場合、「善良な市民」Objective-C コードはどのように動作すると予想されますか? (理想的には、私のプロジェクトは Cocoa の Foundation と同じ精神のフレームワークであるため、最大の「インピーダンス マッチング」のために動作する方法をモデル化したいと考えています。私が見つけた Apple のドキュメントでは、これについてはすべてです。) いずれにせよ、エラーを報告することは当然のことだと思います。オブジェクトを追加する API (シナリオ 2 を引き起こす可能性があります) はエラー パラメーターを受け入れないため、問題を解決するために実際に何ができるでしょうか? そのような状況で本当に大丈夫と考えられるのは何ですか?もっとうまくやれるなら、故意にクラッシュしやすいコードを書くのは嫌です...