Delen via


C28615

waarschuwing C28615: Moet _resetstkoflw in het blok __except() aanroepen bij het aanroepen van _alloca in het __try blok. Roep _resetstkoflw niet aan vanuit een catch()-blok

Het hulpprogramma Codeanalyse rapporteert deze waarschuwing wanneer toepassingen de _resetstkoflw-functie aanroepen binnen een catch-blok of wanneer toepassingen alloca aanroepen in het try-blok zonder _resetstkoflw aan te roepen in het uitzonderingsblok.

Een thread kan slechts één stack-overloopuitzondering (gegenereerd vanuit een aanroep naar _alloca) vangen, tenzij de stack na elke uitzondering wordt hersteld (bijvoorbeeld door _resetstkoflw). Als de stack niet is opgelost nadat de eerste uitzondering is gegenereerd vanuit _alloca, resulteert een tweede uitzondering in onmiddellijke en stille procesbeëindiging.

U moet _resetstkoflw aanroepen wanneer de huidige stackaanwijzer naar een adres wijst dat hoger is dan de derde pagina op de stapel. Dit komt doordat het niet zinvol is om een beveiligde pagina te maken van de huidige pagina waarnaar de stackpointer verwijst (of naar binnen verwijst).

De _resetstkoflw-functie mag niet worden aangeroepen vanuit een filterexpressie van een gestructureerde uitzonderingshandler of vanuit een functie die wordt aangeroepen vanuit een filterexpressie van een gestructureerde uitzonderingshandler.

voorbeelden

Het hulpprogramma Codeanalyse rapporteert deze waarschuwing voor het volgende voorbeeld omdat de filterexpressie wordt aangeroepen voordat de stack wordt afgewikkeld. Wanneer er een stackoverloop is, wordt de filterexpressie aangeroepen wanneer de huidige stackpointer vanaf de onderkant van de stack naar de derde pagina verwijst.

__try 
{
    /* The following could cause stack overflow */
    char *x = _alloca (i);
}
__except ((GetExceptionCode () == EXCEPTION_STACK_OVERFLOW) 
    ? (_resetstkoflw (), EXCEPTION_EXECUTE_HANDLER) 
    : EXCEPTION_CONTINUE_SEARCH)
{
}

Het volgende voorbeeld mislukt ook om vergelijkbare redenen.


__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;
 }
}

In het volgende voorbeeld wordt de fout vermeden.

__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 ();
}