VLA のバッファ オーバーフローをチェックする方法はありますか? -fstack-protector-all -Wstack-protectorを使用しましたが、次の警告が表示されます。
警告: ローカル変数を保護していません: 可変長バッファ
これを達成するためのライブラリはありますか? (-lefence はヒープメモリ用)
現在、Valgrind と gdb を使用しています。
VLA のバッファ オーバーフローをチェックする方法はありますか? -fstack-protector-all -Wstack-protectorを使用しましたが、次の警告が表示されます。
警告: ローカル変数を保護していません: 可変長バッファ
これを達成するためのライブラリはありますか? (-lefence はヒープメモリ用)
現在、Valgrind と gdb を使用しています。
-fstack-protector-all の代わりに -fmudflap を使用できます
更新: 一部のドキュメントとオプションはこちらhttp://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging
おそらく alloca() を使用すると役立つでしょう。c99 を使用する必要がなくなるため、面倒ですが、GCC のマニュアル ページには、alloca() を使用するとスタック保護コードが有効になると書かれているようです。
もちろん、本当の解決策は、スタックを壊そうとしない完璧でバグのないコードを書くことです。
ライブラリがこれをどのように行うことができるかわかりません。可変長配列では、インデックス付けを行う関数を呼び出していないため、ライブラリを「フック」する場所がありません。では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);
}
次に、アクセスを追跡するための適切なマクロ定義 (および補助コード) を考え出します。私が言ったように、それはきれいではありません。もちろん、ビルド時の設定 (デバッグ/リリース モードなど) によって制御された、単純な定義だけにマクロを "コンパイル" できるという考えがあります。