Advertencia C6312

Posible bucle infinito: uso de la constante EXCEPTION_CONTINUE_EXECUTION en la expresión de filtro de excepciones de un try-except

Comentarios

Esta advertencia indica el uso de la constante EXCEPTION_CONTINUE_EXECUTION (u otra constante que se evalúa como -1) en la expresión de filtro de un controlador de excepciones estructurado. El uso del valor constante EXCEPTION_CONTINUE_EXECUTION podría dar lugar a un bucle infinito. Por ejemplo, si el hardware generó una excepción, se reiniciará la instrucción que provocó la excepción. Si la dirección que provocó la excepción sigue siendo incorrecta, se producirá otra excepción y se controlará de la misma manera. El resultado es un bucle infinito.

Una llamada explícita a RaiseException no provocará directamente un bucle infinito, pero continuará la ejecución del código en el bloque protegido. Este comportamiento puede ser inesperado y podría provocar un bucle infinito si RaiseException se usó para evitar desreferenciar un puntero no válido.

Normalmente, EXCEPTION_CONTINUE_EXECUTION solo se debe devolver mediante una función llamada en la expresión de filtro, que tiene la oportunidad de corregir el puntero que provocó la excepción o la memoria subyacente.

Nombre del análisis de código: EXCEPTIONCONTINUEEXECUTION

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