R6035 de erro de tempo de execução c
Microsoft Visual C++ Runtime Library, R6035 de erro - um módulo neste aplicativo está inicializando o cookie de segurança global do módulo, enquanto uma função de contar com esse cookie de segurança está ativa.Chame __security_init_cookie anteriormente.
__security_init_cookiedeve ser chamado antes da primeira utilização 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 (verificação de segurança de buffer) e no código que usa o tratamento de exceção estruturada. Essencialmente, na entrada para uma função protegido a saturação, o cookie é colocado na pilha e, ao sair, o valor na pilha é comparado com o cookie global. Qualquer diferença entre eles indica que uma saturação de buffer ocorreu e resulta no encerramento imediato do programa.
R6035 de erro indica que uma chamada para __security_init_cookie foi feita depois que uma função protegida foi inserida. Se fosse continuar execução, uma saturação de buffer artificiais seria detectada porque o cookie na pilha não coincidir com o cookie global.
Considere o seguinte exemplo DLL. O ponto de entrada DLL é definido para DllEntryPoint, por meio de vinculador / ENTRADA (símbolo de ponto de entrada) opção. Isso ignora a inicialização do CRT que normalmente seria inicializar o cookie de segurança global, para que o da 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 irá gerar o erro R6035, pois DllEntryPoint usa o tratamento de exceção estruturada e, portanto, usa o cookie de segurança para detectar saturações de buffer. No momento em que DllInitialize é chamado, o cookie de segurança global já foi colocado na pilha.
A forma 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 saturações de buffer (ela tem nenhum buffer de seqüência de caracteres local e não usa o tratamento de exceção estruturada); Portanto, pode chamar com segurança __security_init_cookie. Em seguida, ele chama uma função auxiliar que está protegida.
Observação |
---|
Mensagem de erro R6035 é gerada apenas pela depuração do x 86 CRT e somente para a manipulação de exceção estruturada, mas a condição é um erro em todas as plataformas e todas as formas de manipulação de exceção, como, por exemplo, c + + EH. |