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