C6312
Mise à jour : novembre 2007
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");
}
}