C28615
警告 C28615:在呼叫 __try 區塊中的_alloca時,必須在 __except () 區塊中呼叫 _resetstkoflw。 請勿從 catch () 區塊內呼叫_resetstkoflw
程序代碼分析工具會在應用程式在 catch 區塊內呼叫 _resetstkoflw 函式,或在 try 區塊中呼叫 alloca 而不呼叫例外區塊中的 _resetstkoflw 時,報告此警告。
線程只能擷取一個堆疊溢位例外狀況, (從呼叫_alloca) ,除非堆棧在每次例外狀況之後_resetstkoflw) (修復。 如果第一個例外狀況從 _alloca引發之後,堆疊並未修正,則第二個例外狀況會導致立即和無訊息進程終止。
當目前的堆疊指標指向高於堆疊上第三頁的位址時,您必須呼叫 _resetstkoflw 。 這是因為從堆疊指標指向 (的目前頁面建立防護頁面並不合理,或會在一段時間) 指向 。
_resetstkoflw 函式 不應該從結構化例外狀況處理程式篩選表達式或從結構化例外狀況處理程式篩選表達式呼叫的函式呼叫。
範例
程序代碼分析工具會針對下列範例報告此警告,因為堆棧回溯發生之前會呼叫篩選表達式。 當堆棧溢位時,當目前的堆疊指標指向堆棧底部的第三頁時,就會呼叫篩選表達式。
__try
{
/* The following could cause stack overflow */
char *x = _alloca (i);
}
__except ((GetExceptionCode () == EXCEPTION_STACK_OVERFLOW)
? (_resetstkoflw (), EXCEPTION_EXECUTE_HANDLER)
: EXCEPTION_CONTINUE_SEARCH)
{
}
下列範例也會因為類似的原因而失敗。
__try
{
char *x = _alloca (i);
}
__except (SEHFilter (GetExceptionCode ()))
{
}
int SEHFilter (DWORD dwExceptionCode)
{
if (dwExceptionCode == EXCEPTION_STACK_OVERFLOW)
{
_resetstkoflw ();
return EXCEPTION_EXECUTE_HANDLER;
}
else
{
return EXCEPTION_CONTINUE_SEARCH;
}
}
下列範例成功避免錯誤。
__try
{
char *x = _alloca (i);
}
__except ((GetExceptionCode () == EXCEPTION_STACK_OVERFLOW) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
// In this block the stack has already been unwound,
// so this call will succeed.
_resetstkoflw ();
}