5

VLA のバッファ オーバーフローをチェックする方法はありますか? -fstack-protector-all -Wstack-protectorを使用しましたが、次の警告が表示されます。

警告: ローカル変数を保護していません: 可変長バッファ

これを達成するためのライブラリはありますか? (-lefence はヒープメモリ用)

現在、Valgrind と gdb を使用しています。

4

3 に答える 3

1

-fstack-protector-all の代わりに -fmudflap を使用できます

更新: 一部のドキュメントとオプションはこちらhttp://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging

于 2011-04-18T15:16:25.633 に答える
0

おそらく alloca() を使用すると役立つでしょう。c99 を使用する必要がなくなるため、面倒ですが、GCC のマニュアル ページには、alloca() を使用するとスタック保護コードが有効になると書かれているようです。

もちろん、本当の解決策は、スタックを壊そうとしない完璧でバグのないコードを書くことです。

于 2011-04-18T13:11:08.200 に答える
0

ライブラリがこれをどのように行うことができるかわかりません。可変長配列では、インデックス付けを行う関数を呼び出していないため、ライブラリを「フック」する場所がありません。ではmalloc()、割り当ては関数内で明示的であり、追跡できます。

もちろん、コードを調べて、プリプロセッサのトリックを使用して各インデックス ポイントにマクロを追加し、マクロを展開して境界をチェックするコードにすることもできます。しかし、それは非常に邪魔です。

私は変更のようなものを考えています:

void work(int n)
{
  int data[n];   /* Our variable-length array. */

  data[0] = 0;
}

次のようなものに:

#include "vla-tracking.h"

void work(int n)
{
  VLA_NEW(int, data, n);  /* Our variable-length array. */

  VLA_SET(data, 0, 0);
}

次に、アクセスを追跡するための適切なマクロ定義 (および補助コード) を考え出します。私が言ったように、それはきれいではありません。もちろん、ビルド時の設定 (デバッグ/リリース モードなど) によって制御された、単純な定義だけにマクロを "コンパイル" できるという考えがあります。

于 2011-04-18T13:16:48.337 に答える