C6262
警告 C6262: 関数はスタックの <constant> バイトを使用します: /analyze:stacksize<constant 2> を超えています。データの一部をヒープに移動することを考慮してください
この警告は、スタックの使用サイズが、あらかじめ設定されたしきい値 (constant 2) を超えたことが関数の内部で検出されたことを示します。この警告の既定のスタック フレームのサイズは、ユーザー モードの場合は 16 KB、カーネル モードの場合は 1 KB です。スタックのサイズはユーザー モードでも限定されています。スタックのページのコミットに失敗した場合、スタック オーバーフロー例外が発生します。カーネル モードには 12 KB のスタックのサイズ制限があり、これを大きくすることはできないため、カーネル モードのコードは積極的にスタックの使用を制限する必要があります。
この警告の背後にある問題を修正するために、一部のデータをヒープまたは他の動的メモリに移動することができます。ユーザー モードでは、1 つの大きなスタック フレームがあっても問題になることはなく、この警告を抑制することができますが、スタック フレームが大きくなるとスタック オーバーフローのリスクも高くなります (大きなスタック フレームは、関数がスタックを大量に使用する場合や、関数が再帰的な場合に発生する可能性があります)。ユーザー モードでの総スタック サイズは、実際にスタック オーバーフローが発生する場合は増加させることができますが、最大でシステムの制限値までです。/analyze コマンド ライン オプションを使用して <constant 2> の値を変更することはできますが、値を大きくするとエラーが報告されないリスクが発生します。
ドライバー プロジェクトなどでのカーネル モードのコードの場合は、<constant 2> の値は 1 KB に設定されます。適切に記述されたドライバーには、この値に近づく関数はほとんど含まれていないため、制限を下げることが望ましい場合もあります。ユーザー モードのコードでスタック サイズを小さくするために使用される一般的な方法は、カーネル モードのコードにも適合させることができます。
使用例
次に示すコードでは、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 などがあります。詳細については、「スマート ポインター (Modern C++)」および「C++ 標準ライブラリ リファレンス」を参照してください。
スタック サイズを調整してこの警告を修正するには
メニュー バーで [プロジェクト]、[プロパティ] の順に選択します。
[プロパティ ページ] ダイアログ ボックスが表示されます。
[構成プロパティ] を展開します。
[C/C++] を展開します。
[コマンド ライン] プロパティを選択します。
[追加のオプション] に、/analyze:stacksize16388 を追加します。