警告 C6262
関数はconstant_1バイトのスタックを使用します。/analyze:stacksize constant_2を超えています。 データの一部をヒープに移動することを考慮してください
解説
この警告は、スタックの使用サイズがあらかじめ設定されたしきい値 (constant_2) を超えたことが、関数の内部で検出されたことを示します。 この警告の既定のスタック フレームのサイズは、ユーザー モードの場合は 16 KB、カーネル モードの場合は 1 KB です。 スタックのサイズはユーザー モードでも限定されています。スタックのページのコミットに失敗した場合、スタック オーバーフロー例外が発生します。 カーネル モードには 12 KB のスタック サイズの制限があり、これを増やすことはできません。 カーネル モード コードでのスタックの使用を積極的に制限してみてください。
この警告の背後にある問題を修正するために、一部のデータをヒープまたは他の動的メモリに移動することができます。 ユーザー モードでは、1 つの大きなスタック フレームがあっても問題になることはなく、この警告を抑制することができますが、スタック フレームが大きくなるとスタック オーバーフローのリスクも高くなります (関数がスタックを頻繁に使用している場合、または再帰的な場合、大きなスタック フレームが発生する可能性があります)。ユーザー モードのスタック の合計サイズは、スタック オーバーフローが実際に発生した場合に増やすことができますが、システムの上限までしか増やすことができます。
ドライバー プロジェクトなどでのカーネル モード コードの場合は、constant_2 の値は 1 KB に設定されます。 適切に記述されたドライバーには、この値に近づく関数はほとんど含まれていないため、制限を下げることが望ましい場合もあります。 ユーザー モードのコードでスタック サイズを小さくするために使用される一般的な方法は、カーネル モードのコードにも適合させることができます。
コード分析名: EXCESSIVESTACKUSAGE
警告を抑制するためにスタック サイズを調整する
/analyze:stacksize
コマンド ライン オプションを使用して constant_2 の値を変更することはできますが、値を大きくするとエラーが報告されないリスクが発生する場合があります。
コマンド ラインで警告を抑制するには
- コンパイラのコマンド ラインに
/analyze:stacksize <new-size>
オプションを追加します。<new-size>
の値には、constant_1 よりも大きい値を使用してください。 たとえば、constant_1 が 27180 の場合は/analyze:stacksize 32768
と入力できます。
IDE で警告を抑制するには
Visual Studio IDE の [ソリューション エクスプローラー] ウィンドウでプロジェクトを選択します。
メニュー バーで、 [プロジェクト]>[プロパティ] を選択します。
[プロパティ ページ] ダイアログ ボックスで、[構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。
[追加オプション] で
/analyze:stacksize <new-size>
を追加します。<new-size>
は constant_1 よりも大きくなります。 たとえば、constant_1 が 27180 の場合は/analyze:stacksize 32768
と入力できます。 [OK] を選択して変更を保存します。
例
次に示すコードでは、char buffer
によってスタックに 16,382 バイトが必要となり、ローカルの整数変数 i
によってさらに 4 バイトが必要になるため、合計すると既定のスタック サイズの制限である 16 KB を超え、この警告が生成されます。
// cl.exe /c /analyze /EHsc /W4
#include <windows.h>
#define MAX_SIZE 16382
void f( )
{
int i;
char buffer[MAX_SIZE];
i = 0;
buffer[0]='\0';
// code...
}
次に示すコードでは、一部のデータをヒープに移動することでこの警告を修正しています。
// cl.exe /c /analyze /EHsc /W4
#include <stdlib.h>
#include <malloc.h>
#define MAX_SIZE 16382
void f( )
{
int i;
char *buffer;
i = 0;
buffer = (char *) malloc( MAX_SIZE );
if (buffer != NULL)
{
buffer[0] = '\0';
// code...
free(buffer);
}
}
malloc
と free
を使用すると、メモリ リークや例外など、多くの落とし穴が発生します。 これらのリークと例外の問題を完全に回避するには、C++ の標準ライブラリ (STL) によって提供される機構を使用します。 これらには、 shared_ptr
、 unique_ptr
、および vector
が含まれます。 詳細については、「スマート ポインター」および「C++ 標準ライブラリ」を参照してください。