C6312C6312

Advertencia C6312: posible bucle infinito: uso de la constante EXCEPTION_CONTINUE_EXECUTION en la expresión de filtro de excepción de un bloque try-exceptowarning C6312: Possible infinite loop: use of the constant EXCEPTION_CONTINUE_EXECUTION in the exception-filter expression of a try-except

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.This warning indicates the use of the constant EXCEPTION_CONTINUE_EXECUTION (or another constant that evaluates to -1) in the filter expression of a structured exception handler. Uso del valor constante EXCEPTION_CONTINUE_EXECUTION podrían dar lugar a un bucle infinito.Use of the constant value EXCEPTION_CONTINUE_EXECUTION could lead to an infinite loop. Por ejemplo, si se produce una excepción con el hardware, se reiniciará la instrucción que produjo la excepción.For example, if an exception was raised by hardware, the instruction that caused the exception will be restarted. Si la dirección que produjo la excepción sigue siendo incorrecta, otro tipo de excepción se producirá y administrarse de la misma manera.If the address that caused the exception is still bad, another exception will occur and be handled in the same way. Esto hace que un bucle infinito.This causes an infinite loop.

Una llamada explícita a RaiseException le directamente no causa un bucle infinito, pero continuará la ejecución del código en el bloque protegido.An explicit call to RaiseException will not directly cause an infinite loop, but it will continue execution of the code in the protected block. Esto puede ser inesperado y podría provocar un bucle infinito si RaiseException se usó para evitar la desreferenciación de un puntero no válido.This can be unexpected, and could lead to an infinite loop if RaiseException was used to avoid dereferencing an invalid pointer.

Por lo general, EXCEPTION_CONTINUE_EXECUTION debe devolver una función denominada en la expresión de filtro, que tiene una oportunidad para corregir o el puntero que produjo la excepción o la memoria subyacente.Typically, EXCEPTION_CONTINUE_EXECUTION should be returned only by a function called in the filter expression, which has a chance to fix either the pointer that caused the exception or the underlying memory.

EjemploExample

El código siguiente genera esta advertencia:The following code generates this warning:

#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:To correct this warning, use the following code:

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