共用方式為


警告 C6262

函式使用 堆疊constant_1 位元組:超過 /analyze:stacksize constant_2。 請考慮將某些數據移至堆積

備註

此警告表示函式中偵測到超過預設臨界值 (constant_2) 的堆疊使用量。 此警告的預設堆疊框架大小是使用者模式的 16 KB,核心模式為 1 KB。 堆疊,即使在使用者模式中也受到限制,且無法認可堆棧頁面會導致堆疊溢位例外狀況。 核心模式有 12 KB 堆疊大小限制,無法增加。 嘗試主動限制在內核模式程式代碼中使用堆疊。

若要修正此警告背後的問題,您可以將某些數據移至堆積或其他易失記憶體。 在使用者模式中,一個大型堆疊框架可能不是問題,而且可能會隱藏此警告,但大型堆疊框架會增加堆棧溢位的風險。 (如果函式大量使用堆疊或遞歸,可能會發生大型堆疊框架。如果堆疊溢位實際發生,則使用者模式中的堆疊大小總計可以增加,但只能達到系統限制。

例如,針對內核模式程序代碼,在驅動程序專案中,constant_2的值會設定為 1 KB。 撰寫良好的驅動程式應該有幾個函式可接近此值,並可能想要向下變更限制。 用於使用者模式程式代碼以減少堆疊大小的相同一般技術可以調整為內核模式程序代碼。

程式碼分析名稱:EXCESSIVESTACKUSAGE

調整堆疊大小以隱藏警告

您可以使用/analyze:stacksize命令行選項來變更constant_2的值,但增加它會造成可能不會回報錯誤的風險。

隱藏命令行上的警告

  • /analyze:stacksize <new-size> 選項新增至編譯程式命令行。 使用大於 constant_1的值<new-size>。 例如,如果 constant_1 是 27180,您可能會輸入 /analyze:stacksize 32768

隱藏 IDE 中的警告

  1. 在 Visual Studio IDE 中,選取 [方案總管] 視窗中的專案

  2. 在功能表列上,依序選擇 [專案]>[屬性]

  3. 在 [屬性頁] 對話框中,選取 [組態屬性>C/C++>Command Line] 屬性頁。

  4. 在 [其他選項] 中,新增 /analyze:stacksize <new-size>,其中 <new-size> 大於 constant_1 例如,如果 constant_1 是 27180,您可能會輸入 /analyze:stacksize 32768。 選取 [確定] 儲存您的變更。

範例

下列程式代碼會產生此警告,因為 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_ptrvector。 如需詳細資訊,請參閱 智慧型指標C++標準連結庫

另請參閱

/STACK (堆疊設定)
_resetstkoflw
如何:使用原生執行階段檢查