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