Поделиться через


C6312

Обновлен: Ноябрь 2007

C6312

Предупреждение C6312: возможно образование бесконечного цикла. Использование константы EXCEPTION_CONTINUE_EXECUTION в выражении exception-filter внутри try-except.

Это предупреждение указывает на использование константы 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");
  }
}