Erro em runtime de C R6035
Biblioteca em Runtime Microsoft Visual C++, Erro R6035 – Um módulo neste aplicativo está inicializando o cookie de segurança global do módulo enquanto uma função que depende desse cookie de segurança está ativa. Chame __security_init_cookie antecipadamente.
__security_init_cookie deve ser chamado antes do primeiro uso do cookie de segurança global.
O cookie de segurança global é usado para proteção de estouro de buffer no código compilado com /GS (Buffer Security Check) e no código que usa o tratamento estruturado de exceções. Basicamente, na entrada para uma função protegida contra saturação, o cookie é colocado na pilha e, na saída, o valor da pilha é comparado com o cookie global. Qualquer diferença entre eles indica que ocorreu um estouro do buffer e causa o encerramento imediato do programa.
O erro R6035 indica que uma chamada para __security_init_cookie
foi feita depois que uma função protegida foi inserida. Se a execução continuasse, um estouro de buffer falso seria detectado, porque o cookie na pilha não corresponderia mais ao cookie global.
Considere o exemplo de DLL a seguir. O ponto de entrada DLL é definido como DllEntryPoint por meio da opção de vinculador /ENTRY (Símbolo de Ponto de Entrada). Isso ignora a inicialização do CRT, que normalmente inicializaria o cookie de segurança global, portanto, a própria DLL deve chamar __security_init_cookie
.
// Wrong way to call __security_init_cookie
DllEntryPoint(...) {
DllInitialize();
...
__try {
...
} __except()... {
...
}
}
void DllInitialize() {
__security_init_cookie();
}
Este exemplo gerará o erro R6035, porque o DllEntryPoint usa tratamento de exceção estruturado e, portanto, usa o cookie de segurança para detectar estouros de buffer. No momento em que DllInitialize é chamado, o cookie de segurança global já foi colocado na pilha.
A maneira correta é demonstrada neste exemplo:
// Correct way to call __security_init_cookie
DllEntryPoint(...) {
__security_init_cookie();
DllEntryHelper();
}
void DllEntryHelper() {
...
__try {
...
} __except()... {
...
}
}
Nesse caso, o DllEntryPoint não está protegido contra estouros de buffer (ele não tem buffers de cadeia de caracteres locais e não usa tratamento estruturado de exceções); portanto, ele pode chamar __security_init_cookie
com segurança. Em seguida, ele chama uma função auxiliar protegida.
Observação
A mensagem de erro R6035 só é gerada pelo CRT de depuração x86, e somente para tratamento estruturado de exceções, mas a condição é um erro em todas as plataformas, e para todas as formas de tratamento de exceção, como o C++ EH.