算術オーバーフローとアンダーフローを防ぐための 1 つの最も効果的な方法

StackOverflow https://stackoverflow.com/questions/78913

質問

予防するための最も効果的な方法は何ですか 算術オーバーフロー そして アンダーフロー?

思い浮かぶ例は次のとおりです。

  • 有効な入力範囲に基づいたテスト
  • 形式的な手法を使用した検証
  • 不変式の使用
  • 言語機能またはライブラリを使用した実行時の検出 (これは阻止しません)
役に立ちましたか?

解決

1 つの可能性は、オーバーフローやアンダーフローが発生しない任意のサイズの整数を持つ言語を使用することです。

それ以外の場合、これが本当に心配な場合、および言語で許可されている場合は、整数のように動作するが、すべての操作でオーバーフローをチェックするラッパー クラスを作成します。デバッグ ビルドでチェックを実行させ、リリース ビルド用に最適化されたままにすることもできます。C++ のような言語ではこれを行うことができ、リリース ビルドではほぼ整数と同じように動作しますが、デバッグ ビルドでは完全な実行時チェックが行われます。

class CheckedInt
{
private: 
    int Value;

public:
    // Constructor
    CheckedInt(int src) : Value(src) {}

    // Conversions back to int
    operator int&() { return Value; }
    operator const int &() const { return Value; }

    // Operators
    CheckedInt operator+(CheckedInt rhs) const
    {
        if (rhs.Value < 0 && rhs.Value + Value > Value)
            throw OverflowException();
        if (rhs.Value > 0 && rhs.Value + Value < Value)
            throw OverflowException();
        return CheckedInt(rhs.Value + Value);
    }

    // Lots more operators...
};

編集:

誰かがそうだったことが判明 C++ではすでにこれを行っています - 現在の実装は Visual Studio に重点を置いていますが、gcc もサポートされているようです。

他のヒント

私はコードの範囲/有効性チェックを行うために多くのテストコードを作成します。これは、この種の状況のほとんどを捕捉する傾向があり、より確実なコードを作成するのに間違いなく役立ちます。

次のような高精度の浮動小数点数を使用します。 ロングダブル.

あなたのリストには非常に重要なオプションが 1 つ欠けていると思います。仕事に適したプログラミング言語を選択してください。固定サイズの整数がないため、これらの問題が発生しないプログラミング言語は数多くあります。

使用する言語を選択するときは、整数のサイズよりも重要な考慮事項があります。値が範囲内かどうかわからない場合は入力をチェックするだけで、非常にまれなケースの場合は例外処理を使用します。

多くの場合、矛盾をチェックするラッパーは意味があります。2 つ以上の整数に対する加算演算 (加算または乗算) の結果がオペランドよりも小さい値になった場合は、何か問題が発生したことがわかります。すべての追加操作の後には、次のようにする必要があります。

if (sum < operand1 || sum < operand2)
    omg_error();

同様に、論理的により小さい値が得られるはずの操作は、誤って埋め込まれたかどうかをチェックする必要があります。

コードにオーバーフローがないことを証明するために、形式的な方法を使用してコードをチェックする方法を調査したことがありますか?抽象解釈として知られる形式的手法手法を使用すると、ソフトウェアの堅牢性をチェックして、ソフトウェアがオーバーフロー、アンダーフロー、ゼロ除算、オーバーフロー、またはその他の同様の実行時エラーに悩まされないことを証明できます。これはソフトウェアを徹底的に分析する数学的手法です。この技術は 1970 年代に Patrick Cousot によって開発されました。この技術は、オーバーフローが打ち上げロケットの破壊を引き起こしたアリアン 5 ロケットのオーバーフロー状態を診断するために使用され、成功しました。浮動小数点数を整数に変換するときにオーバーフローが発生しました。このテクニックの詳細については、こちらをご覧ください。 ここ そしてまた ウィキペディア.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top