Share via


C6312

경고 C6312: 무한 루프가 발생할 수 있습니다. try-except의 예외 필터 식에서 상수 EXCEPTION_CONTINUE_EXECUTION을 사용했습니다.

이 경고는 구조적 예외 처리기의 필터 식에서 상수 EXCEPTION_CONTINUE_EXECUTION(또는 -1로 계산되는 다른 상수)을 사용했음을 나타냅니다. 상수 값 EXCEPTION_CONTINUE_EXECUTION을 사용하면 무한 루프가 발생할 수 있습니다. 예를 들어, 하드웨어에 의해 예외가 발생한 경우 예외의 원인이 된 명령이 다시 시작됩니다. 예외를 발생시킨 주소가 계속 잘못되어 있으면 다른 예외가 발생하고 동일한 방식으로 처리됩니다. 이로 인해 무한 루프가 발생할 수 있습니다.

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