Condividi tramite


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