C6312

avertissement C6312 : Boucle infinie possible : utilisation de la constante EXCEPTION_CONTINUE_EXECUTION dans l'expression de filtre d'exception d'une instruction try-except

Cet avertissement indique l'utilisation de la constante EXCEPTION_CONTINUE_EXECUTION (ou d'une autre constante qui s'évalue à -1) dans l'expression de filtre d'un gestionnaire d'exceptions structuré. L'utilisation de la valeur de constante EXCEPTION_CONTINUE_EXECUTION peut mener à une boucle infinie. Par exemple, si une exception a été déclenchée par le matériel, l'instruction qui a provoqué l'exception sera redémarrée. Si l'adresse qui a provoqué l'exception est encore erronée, une autre exception se produira et sera gérée de la même façon. Cela provoque une boucle infinie.

Un appel explicite à RaiseException ne provoquera pas directement une boucle infinie, mais poursuit l'exécution du code dans le bloc protégé. Cela peut être inattendu et mener à une boucle infinie si RaiseException a été utilisé pour éviter de déréférencer un pointeur non valide.

En général, EXCEPTION_CONTINUE_EXECUTION ne doit être retourné que par une fonction appelée dans l'expression de filtre qui a une chance de corriger soit le pointeur qui a provoqué l'exception, soit la mémoire sous-jacente.

Exemple

Le code suivant génère cet avertissement :

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

Pour corriger cet avertissement, utilisez le code suivant :

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