Udostępnij za pośrednictwem


C6312

Ostrzeżenie C6312: możliwa nieskończona pętla: użyj stałej EXCEPTION_CONTINUE_EXECUTION w wyrażeniu filtru wyjątków dla try-except

To ostrzeżenie wskazuje użycie stałej EXCEPTION_CONTINUE_EXECUTION (lub innej stałej, dającej -1) w wyrażeniu filtru obsługi wyjątków strukturalnych.Użycie wartości stałej EXCEPTION_CONTINUE_EXECUTION może prowadzić do nieskończonej pętli.Na przykład, jeśli wyjątek został wygenerowany przez sprzęt, instrukcja, która spowodowała wyjątek zostanie uruchomiona ponownie.Jeśli adres, który spowodował wyjątek jest nadal zły, wystąpi inny wyjątek, który zostanie obsłużony w ten sam sposób.Spowoduje to nieskończoną pętlę.

Jawne wywołanie RaiseException nie spowoduje bezpośrednio nieskończonej pętli, ale będzie kontynuować wykonanie kodu w bloku chronionym.Może to być nieoczekiwane i może prowadzić do nieskończonej pętli, jeśli RaiseException został użyty do uniknięcia usunięcia odwołania do nieprawidłowego wskaźnika.

Zazwyczaj EXCEPTION_CONTINUE_EXECUTION powinien być zwracany tylko przez funkcję w wyrażeniu filtru, który ma szansę, aby naprawić, albo wskaźnik, który spowodował wyjątek, albo pamięć.

Przykład

Poniższy kod generuje to ostrzeżenie:

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

Aby poprawić to ostrzeżenie, należy użyć następującego kodu:

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