C6312
Aviso C6312: possível loop infinito: usar a constante EXCEPTION_CONTINUE_EXECUTION na expressão de filtro de exceção de um bloco try-exceto
Este aviso indica o uso da constante EXCEPTION_CONTINUE_EXECUTION (ou outra constante que é avaliada como -1) na expressão do filtro de um manipulador de exceção estruturada.Uso do valor da constante EXCEPTION_CONTINUE_EXECUTION pode levar a um loop infinito.Por exemplo, se uma exceção foi gerada pelo hardware, a instrução que causou a exceção será reiniciada.Se o endereço que causou a exceção é ainda ruim, outra exceção ocorrerá e ser tratada da mesma maneira.Isso faz com que um loop infinito.
Uma chamada explícita para RaiseException irá não diretamente causa um loop infinito, mas continuará a execução do código no bloco protegido.Isso pode ser inesperado e pode levar a um loop infinito se RaiseException foi usado para evitar a desreferência um ponteiro inválido.
Normalmente, EXCEPTION_CONTINUE_EXECUTION deve ser retornado somente por uma função chamada na expressão de filtro, que tem a oportunidade de corrigir o ponteiro que causou a exceção de um ou a memória subjacente.
Exemplo
O código a seguir gera este aviso:
#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 corrigir esse aviso, use o código a seguir:
#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");
}
}