VLAのバッファオーバーフローをチェックする方法はありますか?私は-fstack-プロテクター - すべて-Wstackプロテクターを使用しますが、これらの警告を得る:可変長アレイ(VLA)の境界チェック?
警告:ローカル変数を保護しない:可変長バッファ
は、これを達成するためのライブラリはありますか? (枠はヒープメモリ用)
私は現在Valgrindとgdbを使用しています。
VLAのバッファオーバーフローをチェックする方法はありますか?私は-fstack-プロテクター - すべて-Wstackプロテクターを使用しますが、これらの警告を得る:可変長アレイ(VLA)の境界チェック?
警告:ローカル変数を保護しない:可変長バッファ
は、これを達成するためのライブラリはありますか? (枠はヒープメモリ用)
私は現在Valgrindとgdbを使用しています。
おそらく、alloca()を使用すると役立ちます。これは迷惑なことです。なぜなら、c99を使用する必要がないからです。しかし、GCCのmanページでは、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);
}
その後のアクセスを追跡するために、適切なマクロ定義(および補助コード)を思い付きます。私が言ったように、それはきれいではありません。もちろん、マクロはあるビルドタイム設定(デバッグ/リリースモードなど)によって制御された単純な定義だけにコンパイルすることができます。
あなたは-fstack-プロテクター - すべて
更新の代わりに-fmudflap使用することができますいくつかのドキュメントとオプションは、ここでhttp://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging
です