Предупреждение C6312
Возможный бесконечный цикл: использование константы EXCEPTION_CONTINUE_EXECUTION в выражении фильтра исключений try-except
Замечания
Это предупреждение указывает на использование константы (или другой константы 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 Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по