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


Ошибка времени выполнения C R6035

Библиотека среды выполнения Microsoft Visual C++, ошибка R6035. Модуль в этом приложении инициализирует глобальный файл cookie безопасности модуля, а функция, использующую этот файл cookie безопасности, активен. Вызов __security_init_cookie ранее.

__security_init_cookie необходимо вызвать перед первым использованием файла cookie глобальной безопасности.

Глобальный файл cookie безопасности используется для защиты от переполнения буфера в коде, скомпилированном с помощью /GS (проверка безопасности буфера) и в коде, использующего структурированную обработку исключений. По сути, при входе в функцию, защищенную перерасходом, файл cookie помещается в стек, а при выходе значение в стеке сравнивается с глобальным файлом cookie. Любая разница между ними указывает на то, что превышено превышение буфера и приводит к немедленному завершению программы.

Ошибка R6035 указывает, что вызов __security_init_cookie был выполнен после ввода защищенной функции. Если выполнение будет продолжаться, будет обнаружена спрогнозная переполнение буфера, так как файл cookie в стеке больше не будет соответствовать глобальному файлу cookie.

Рассмотрим следующий пример DLL. Для точки входа DLL задано значение DllEntryPoint с помощью параметра компоновщика /ENTRY (символ точки входа). Это проходит инициализацию CRT, которая обычно инициализирует глобальный файл cookie безопасности, поэтому сама библиотека DLL должна вызываться __security_init_cookie.

// Wrong way to call __security_init_cookie
DllEntryPoint(...) {
   DllInitialize();
   ...
   __try {
      ...
   } __except()... {
      ...
   }
}

void DllInitialize() {
   __security_init_cookie();
}

В этом примере возникнет ошибка R6035, так как DllEntryPoint использует структурированную обработку исключений и поэтому использует файл cookie безопасности для обнаружения переполнения буфера. К тому времени, когда вызывается DllInitialize, файл cookie глобальной безопасности уже помещен в стек.

Правильный способ демонстрируется в этом примере:

// Correct way to call __security_init_cookie
DllEntryPoint(...) {
   __security_init_cookie();
   DllEntryHelper();
}

void DllEntryHelper() {
   ...
   __try {
      ...
   } __except()... {
      ...
   }
}

В этом случае DllEntryPoint не защищается от переполнения буфера (он не имеет локальных строковых буферов и не использует структурированную обработку исключений); поэтому он может безопасно вызывать __security_init_cookie. Затем он вызывает вспомогательные функции, защищенные.

Примечание.

Сообщение об ошибке R6035 создается только отладкой CRT x86 и только для структурированной обработки исключений, но условие является ошибкой на всех платформах и для всех форм обработки исключений, таких как C++ EH.

См. также

Функции безопасности в MSVC