Предупреждение 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");
  }
}