Partilhar via


C6312

Aviso C6312: Possível loop infinito: usar a constante EXCEPTION_CONTINUE_EXECUTION na expressão de filtro de exceção de uma instrução 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. Usar o 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 é ruim ainda, outra exceção ocorrerá e ser tratada da mesma maneira. Isso faz um loop infinito.

Uma chamada explícita para RaiseException não diretamente fará 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 de 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 tanto o ponteiro que causou a exceção ou 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 seguinte código:

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