3

多くの場合、バッファオーバーフローに問題があります。

int y[10][10][10];

..。

y[0][15][3] = 8;

どうすればこの問題を防ぐことができますか?私を助けることができる良いツールはありますか?

4

6 に答える 6

10

一般的なケースではニールの答えの方が優れていますが、単純な古い配列を使用する理由がある場合は、関数を使用して値を取得および設定し、配列の範囲内にあることを確認できます。

#define MAX_INDEX 10

int y[MAX_INDEX][MAX_INDEX][MAX_INDEX];

int get_y(int a, int b, int c)
{
    ASSERT(a >= 0 && a < MAX_INDEX);
    ASSERT(b >= 0 && b < MAX_INDEX);
    ASSERT(c >= 0 && c < MAX_INDEX);
    return y[a][b][c];
}

void set_y(int a, int b, int c, int value)
{
    ASSERT(a >= 0 && a < MAX_INDEX);
    ASSERT(b >= 0 && b < MAX_INDEX);
    ASSERT(c >= 0 && c < MAX_INDEX);
    y[a][b][c] = value;
}

...理想的には、すべてがクラスにまとめられます。

于 2009-07-05T11:39:35.147 に答える
10

生のCスタイルの配列は使用しないでください。代わりに、std ::vectorなどのC++コンテナクラスを使用してください。これらのクラスは、無効なアクセスをチェックし、発生したときに例外を発生させる機能を備えています。

また、あなたが説明しているのは、実際にはバッファオーバーフローではありません。

于 2009-07-05T11:39:35.693 に答える
1

他のコメントに加えて、静的コード分析ツールを扱っているこのスレッドの提案もご覧ください。

LintのC/C ++無料代替品?

于 2009-07-05T11:50:06.517 に答える
1

コードレベルでのソリューション

C++ での 1 つの解決策は、配列を使用せず、代わりに C++ コンテナーを使用することです。たとえば、索引付けに [] の代わりに at を使用すると、ベクトルは境界外検出を行います。

C では、ポインターと配列の次元を指定するなど、常に関数を設計する必要があります。これを回避する方法はありません。

ツールレベルでのソリューション

範囲外アクセスをチェックするための優れたツールは valgrind です。バイナリを変更せずに実行することで機能し、デバッグ情報を使用してコンパイルすると、エラーが発生した正確な行を示すことができます。Valgrind は、mac os x を含む多くの UNIX で動作します。

valgrind はこれらの不正なアクセスを常に検出できるとは限らないことに注意してください (あなたの例では、それが実際の境界外アクセスであると仮定すると、変数はヒープではなくスタック上にあるため、valgrind によって気付かれませんでした)。

于 2009-07-05T12:10:49.407 に答える
-1

TRACE MACROSでsprintfを使用することは最大の悪です

于 2009-07-06T11:51:23.643 に答える