C6312
upozornění C6312: Možný výskyt nekonečné smyčky: ve výrazu filtrování výjimek příkazu try-except použijte konstantu EXCEPTION_CONTINUE_EXECUTION
Toto upozornění indikuje použití konstanty EXCEPTION_CONTINUE_EXECUTION (nebo jiné konstanty vyhodnocené jako -1) ve výrazu filtrování ve strukturované obslužné rutině výjimky.Použití konstantní hodnoty EXCEPTION_CONTINUE_EXECUTION může vést k vytvoření nekonečné smyčky.Například jestliže byla výjimka vyvolána hardwarem, instrukce, která výjimku způsobila, bude restartována.Jestliže adresa, která výjimku způsobila je stále špatná, objeví se další výjimka a bude s ní zacházeno stejným způsobem.To způsobí vytvoření nekonečné smyčky.
Explicitní volání RaiseException nezpůsobí nekonečnou smyčku přímo, ale bude pokračovat v provádění kódu v chráněném bloku.Což může být neočekávané a může vést k vytvoření nekonečné smyčky, jestliže byla RaiseException použita k zabránění ve zrušení reference neplatného ukazatele.
Obvykle by měla být konstanta EXCEPTION_CONTINUE_EXECUTION vrácena pouze funkcí volanou filtrovacím výrazem, který má možnost opravit ukazatel, který výjimku způsobil, nebo podkladovou paměť.
Příklad
Následující kód generuje toto upozornění:
#include <excpt.h>
#include <stdio.h>
#include <windows.h>
void f (char *ptr)
{
__try
{
// exception occurs if the caller passes null ptr
// code...
*ptr = '\0';
}
__except (EXCEPTION_CONTINUE_EXECUTION)
// When EXCEPTION_CONTINUE_EXECUTION is used, the handler
// block of the structured exception handler is not executed.
{
puts("This block is never executed");
}
}
Pro opravu tohoto upozornění použijte následující kód:
#include <excpt.h>
#include <stdio.h>
#include <windows.h>
void f (char *ptr)
{
__try
{
// exception occurs if the caller passes null ptr
// code...
*ptr = '\0';
}
__except (GetExceptionCode()== EXCEPTION_ACCESS_VIOLATION ?
EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{
puts("Error Occurred");
}
}