C6312

更新:2007 年 11 月

警告 C6312:可能是无限循环: 在一个 try-except 的异常筛选器表达式中使用常数 EXCEPTION_CONTINUE_EXECUTION

此警告指出在结构化异常处理程序的筛选器表达式中使用了 EXCEPTION_CONTINUE_EXECUTION 常数(或另一个计算结果为 -1 的常数)。使用常数值 EXCEPTION_CONTINUE_EXECUTION 可能会导致无限循环。例如,如果异常是由硬件引发的,则会重新启动导致该异常的指令。如果导致该异常的地址仍然是错误的,则会出现另一个异常并需要按同样的方式进行处理。这将导致无限循环。

对 RaiseException 的显式调用将不直接导致无限循环,但是它将继续执行受保护的块中的代码。这可能是意料之外的,而且如果使用 RaiseException 来避免取消引用无效指针,则还可能会导致无限循环。

通常,EXCEPTION_CONTINUE_EXECUTION 只应当由在筛选器表达式中调用的函数返回,这样便有机会修复导致该异常的指针或者基础内存。

示例

下面的代码生成此警告:

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

若要更正此警告,请使用下面的代码:

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