Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
avviso C28615: deve chiamare _resetstkoflw nel blocco __except() quando si chiama _alloca nel blocco __try. Non chiamare _resetstkoflw dall'interno di un blocco catch()
Lo strumento Analisi codice segnala questo avviso quando le applicazioni chiamano la funzione _resetstkoflw all'interno di un blocco catch o quando le applicazioni chiamano alloca nel blocco try senza chiamare _resetstkoflw nel blocco tranne.
Un thread può intercettare una sola eccezione di overflow dello stack (generata da una chiamata a _alloca) a meno che lo stack non venga riparato (ad esempio, da _resetstkoflw) dopo ogni eccezione. Se lo stack non viene risolto dopo che la prima eccezione viene generata da _alloca, una seconda eccezione comporterà la chiusura immediata e invisibile all'utente del processo.
È necessario chiamare _resetstkoflw quando il puntatore dello stack corrente punta a un indirizzo superiore alla terza pagina nello stack. Ciò è dovuto al fatto che non ha senso escludere una pagina di protezione dalla pagina corrente a cui punta il puntatore dello stack (o farà riferimento in un momento).
La funzione _resetstkoflw non deve essere chiamata da un'espressione di filtro del gestore eccezioni strutturata o da una funzione chiamata da un'espressione di filtro del gestore eccezioni strutturata.
Esempi di
Lo strumento Analisi codice segnala questo avviso per l'esempio seguente perché l'espressione di filtro viene chiamata prima che si verifichi la rimozione dello stack. Quando è presente un overflow dello stack, l'espressione di filtro viene chiamata quando il puntatore dello stack corrente punta alla terza pagina dalla parte inferiore dello stack.
__try
{
/* The following could cause stack overflow */
char *x = _alloca (i);
}
__except ((GetExceptionCode () == EXCEPTION_STACK_OVERFLOW)
? (_resetstkoflw (), EXCEPTION_EXECUTE_HANDLER)
: EXCEPTION_CONTINUE_SEARCH)
{
}
L'esempio seguente non riesce anche per motivi simili.
__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;
}
}
Nell'esempio seguente viene evitato correttamente l'errore.
__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 ();
}