Ошибка времени выполнения 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.