다음을 통해 공유


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