Share via


警告 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 で警告を抑制するには

  1. Visual Studio IDE の [ソリューション エクスプローラー] ウィンドウでプロジェクトを選択します。

  2. メニュー バーで、 [プロジェクト]>[プロパティ] を選択します。

  3. [プロパティ ページ] ダイアログ ボックスで、[構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。

  4. [追加オプション]/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);
    }
}

mallocfree を使用すると、メモリ リークや例外など、多くの落とし穴が発生します。 これらのリークと例外の問題を完全に回避するには、C++ の標準ライブラリ (STL) によって提供される機構を使用します。 これらには、 shared_ptrunique_ptr 、および vector が含まれます。 詳細については、「スマート ポインター」および「C++ 標準ライブラリ」を参照してください。

関連項目

/STACK (スタック割り当て)
_resetstkoflw
方法 : ネイティブ ランタイム チェックを使用する