Avertissement C6312

Boucle infinie possible : utilisation de la constante EXCEPTION_CONTINUE_EXECUTION dans l’expression de filtre d’exception d’un try-except

Notes

Cet avertissement indique l’utilisation de la constante EXCEPTION_CONTINUE_EXECUTION (ou une autre constante qui prend la valeur -1) dans l’expression de filtre d’un gestionnaire d’exceptions structurées. L’utilisation de la valeur EXCEPTION_CONTINUE_EXECUTION constante peut entraîner une boucle infinie. Par exemple, si une exception a été levée par du matériel, l’instruction qui a provoqué le redémarrage de l’exception. Si l’adresse à l’origine de l’exception est toujours incorrecte, une autre exception se produit et est gérée de la même façon. Le résultat est une boucle infinie.

Un appel explicite à RaiseException ne provoque pas directement une boucle infinie, mais continue l’exécution du code dans le bloc protégé. Ce comportement peut être inattendu et peut entraîner une boucle infinie si RaiseException elle a été utilisée pour éviter de déréférer un pointeur non valide.

En règle générale, EXCEPTION_CONTINUE_EXECUTION elle doit être retournée uniquement par une fonction appelée dans l’expression de filtre, qui a la possibilité de corriger le pointeur qui a provoqué l’exception ou la mémoire sous-jacente.

Nom de l’analyse du code : EXCEPTIONCONTINUEEXECUTION

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