次の方法で共有


警告 C6312

無限ループの可能性: try-except の例外フィルター式で定数EXCEPTION_CONTINUE_EXECUTIONを使用する

解説

この警告は、構造化例外ハンドラーのフィルター式で定数 EXCEPTION_CONTINUE_EXECUTION (または -1 に評価される別の定数) を使用していることを示します。 定数値 EXCEPTION_CONTINUE_EXECUTION を使用すると、無限ループに陥る可能性があります。 たとえば、ハードウェアによって例外が発生した場合、例外の原因となった命令が再起動されます。 例外の原因となったアドレスが依然として間違っている場合は、別の例外が発生し、同じ方法で処理されます。 結果は無限ループになります。

明示的な RaiseException 呼び出しでは無限ループは直接発生しませんが、保護されたブロック内のコードの実行は続行されます。 この動作は予期しない可能性があり、無効なポインターの逆参照を回避するために使用された場合 RaiseException 、無限ループにつながる可能性があります。

通常、EXCEPTION_CONTINUE_EXECUTION は、フィルター式で呼び出された関数によってのみ返される必要があります。この場合、例外の原因となったポインターまたは基になるメモリを修正する機会があります。

コード分析名: EXCEPTIONCONTINUEEXECUTION

この警告が発生するコード例を次に示します。

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