Avviso C6312
Possibile ciclo infinito: uso della costante EXCEPTION_CONTINUE_EXECUTION nell'espressione di filtro eccezioni di un try-except
Osservazioni:
Questo avviso indica l'uso della costante EXCEPTION_CONTINUE_EXECUTION
(o di un'altra costante che restituisce -1) nell'espressione di filtro di un gestore di eccezioni strutturato. L'uso del valore EXCEPTION_CONTINUE_EXECUTION
costante può portare a un ciclo infinito. Ad esempio, se un'eccezione è stata generata dall'hardware, 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 e verrà gestita nello stesso modo. Il risultato è un ciclo infinito.
Una chiamata esplicita a RaiseException
non causerà direttamente un ciclo infinito, ma continuerà l'esecuzione del codice nel blocco protetto. Questo comportamento può essere imprevisto e potrebbe causare un ciclo infinito se RaiseException
è stato usato per evitare di dereferenziare un puntatore non valido.
In genere, EXCEPTION_CONTINUE_EXECUTION
deve essere restituito solo da una funzione chiamata nell'espressione di filtro, che ha la possibilità di correggere il puntatore che ha causato l'eccezione o la memoria sottostante.
Nome dell'analisi del codice: EXCEPTIONCONTINUEEXECUTION
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 correggere questo avviso, usare 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");
}
}
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per