Sdílet prostřednictvím


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");
  }
}