Condividi tramite


C6312

avviso C6312: Possibile ciclo infinito: utilizzo della costante EXCEPTION_CONTINUE_EXECUTION nell'espressione exception-filter di un try-except

Questo avviso indica l'utilizzo della costante EXCEPTION_CONTINUE_EXECUTION o di un'altra costante che restituisce -1 nell'espressione filtro di un gestore di eccezioni strutturato.L'utilizzo del valore della costante EXCEPTION_CONTINUE_EXECUTION potrebbe portare a un ciclo infinito.Se un'eccezione è stata generata dall'hardware, ad esempio, l'istruzione che ha causato l'eccezione verrà riavviata.Se l'indirizzo che ha causato l'eccezione non è ancora valido, si verificherà un'altra eccezione, che verrà gestita nello stesso modo.Verrà quindi determinato un ciclo infinito.

Una chiamata esplicita a RaiseException non causerà direttamente un ciclo infinito ma determinerà la continuazione dell'esecuzione del codice nel blocco protetto.Questa situazione potrebbe essere imprevista e portare a un ciclo infinito se è stato utilizzato RaiseException per evitare la dereferenziazione di un puntatore non valido.

In genere, EXCEPTION_CONTINUE_EXECUTION dovrebbe essere restituito solo da una funzione chiamata nell'espressione filtro, con una possibilità di correggere il puntatore che ha causato l'eccezione o la memoria sottostante.

Esempio

Il codice seguente genera questo avviso:

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

Per risolvere il problema, utilizzare il codice seguente:

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