C6312
更新 : 2007 年 11 月
警告 C6312: 無限ループが発生している可能性があります: try-except の例外フィルタ式で定数 EXCEPTION_CONTINUE_EXECUTION が使用されています。
この警告は、構造化例外ハンドラのフィルタ式での定数 EXCEPTION_CONTINUE_EXECUTION (または -1 に評価される別の定数) の使用を示します。定数値 EXCEPTION_CONTINUE_EXECUTION を使用すると、無限ループが発生する可能性があります。たとえば、例外がハードウェアによって発生した場合、例外を発生させた命令が再実行されます。例外の原因となったアドレスが不正なままであれば、もう 1 つの例外が発生し、同じ方法で処理されます。これにより、無限ループが生じます。
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");
}
}