大規模なプロジェクトに取り組んでいますが、一般的にうまく動作しますが、入力データサイズが制限を超えると深刻な問題が発生します。Cプログラムで(すべての)整数オーバーフローを見つける方法は?
これらの問題であるが、(疑われる)のみによる符号付き整数にこのようなオーバーフロー:
明らかint a, o;
// Initialize a and o
int x = (a+o) >> 1);
、およびOオーバーフロー(2^31-1より大きくなる)の和と、Xはノーaとoの平均を長くします。
実行中のプログラムでこれらの整数オーバーフローをすべて見つける一般的な方法はありますか?
私はValgrindやGDB拡張のようなツールを考えていますが、すべての整数算術命令でブレークし、パラメータをとり、正しい結果(より大きいサイズのデータ型または任意精度の算術で計算されたもの)を実際の結果と比較します。結果が異なる場合は、警告を出力するか、デバッグブレークをトリガするか、このようなものを出力する必要があります。
私は、オーバーフローのための単一の算術命令をチェックする方法を知っています(例えば、加算の符号をチェックするなど)。しかし、膨大な量のコードのために、プロジェクト全体をチェックし、コードを手でどこにでも置くことができます。
私はおおまかに言えば、ユーザーの入力にはどのような制限がありますか。コードを処理する際の問題は、プロジェクトには200k行(私が書いたものではない199k)があり、オーバーフローする可能性のあるコードを手動でチェックすることはかなり恐れていることです。 – ChrisM
@ChrisM - 誰かが書いたコードを信頼できない立場にいるなら、おそらくそれを使うべきではないでしょう。このような事柄(レビュー、テストなど)に対処するためのビジネス慣行が取られるべきである。このコードを使用しているだけで、周囲に誰もいない場合は、とにかくそれを読み終えるのに少し時間を費やす必要があります。 – OrangeDog
さて、それは残念です。私は、問題のあるセクションをコード内で(おそらく十数個、あるいはそれ以上)見つけることができればと期待しています。 – ChrisM