次の方法で共有


C6312

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