C6312
Actualización: noviembre 2007
C6312
Advertencia C6312: Posible bucle infinito: se utilizará la constante EXCEPTION_CONTINUE_EXECUTION en la expresión de filtro de excepciones de try-except
Esta advertencia que se utiliza la constante EXCEPTION_CONTINUE_EXECUTION (u otra constante cuya evaluación sea -1) en la expresión de filtro de un controlador de excepciones estructurado. El uso del valor de la constante EXCEPTION_CONTINUE_EXECUTION podría provocar un bucle infinito. Por ejemplo, si el hardware genera una excepción, se reinicia la instrucción que ha causado la excepción. Si la dirección que ha provocado la excepción sigue siendo incorrecta, se producirá otra excepción y se tratará de la misma manera. Así se crea un bucle infinito.
Una llamada explícita a RaiseException no provoca directamente un bucle infinito, sino que continuará la ejecución del código en el bloque protegido. Esto puede ser algo inesperado y provocar un bucle infinito si se ha utilizado RaiseException para evitar la eliminación de referencias de un puntero no válido.
Normalmente, EXCEPTION_CONTINUE_EXECUTION sólo debe devolverlo una función a la que se llame en la expresión de filtro, que tiene la posibilidad de corregir el puntero que ha causado la excepción o la memoria subyacente.
Ejemplo
El código siguiente genera esta advertencia:
#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");
}
}
Para corregir esta advertencia, utilice el código siguiente:
#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");
}
}