Compartir a través de


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