警告 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 中的警告
在 Visual Studio IDE 中,選取 [方案總管 ] 視窗中的專案 。
在功能表列上,依序選擇 [專案]>[屬性]。
在 [ 屬性頁] 對話方塊中,選取 [ 組態屬性 > C/C++ > 命令列 ] 屬性頁。
在 [其他選項] 中 ,新增
/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);
}
}
使用 malloc
和 free
有許多陷阱,例如記憶體流失和例外狀況。 若要完全避免這類洩漏和例外狀況問題,請使用 C++ 標準程式庫 (STL) 所提供的機制。 這些包括 shared_ptr
、 unique_ptr
和 vector
。 如需詳細資訊,請參閱 智慧型指標 和 C++ 標準程式庫 。