次の方法で共有


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_ptrunique_ptrvector などがあります。詳細については、「スマート ポインター (Modern C++)」および「C++ 標準ライブラリ リファレンス」を参照してください。

スタック サイズを調整してこの警告を修正するには

  1. メニュー バーで [プロジェクト][プロパティ] の順に選択します。

    [プロパティ ページ] ダイアログ ボックスが表示されます。

  2. [構成プロパティ] を展開します。

  3. [C/C++] を展開します。

  4. [コマンド ライン] プロパティを選択します。

  5. [追加のオプション] に、/analyze:stacksize16388 を追加します。

参照

処理手順

方法 : ネイティブ ランタイム チェックを使用する

関連項目

/STACK (スタック割り当て)

_resetstkoflw