C6312
Aggiornamento: novembre 2007
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 risoluzione del riferimento a 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");
}
}