警告 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");
}
}
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示