Partilhar via


C Erro de tempo de execução 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. Ligue __security_init_cookie antes.

Observações

__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 contra saturação de buffer em código compilado com /GS (Buffer Security Check) e em código que usa tratamento estruturado de exceções. Essencialmente, na entrada para uma função protegida contra 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 ocorreu uma saturação de buffer e resulta no encerramento imediato do programa.

O erro R6035 indica que foi feita uma chamada para __security_init_cookie depois de ter sido introduzida uma função protegida. Se a execução continuasse, uma saturação de buffer espúrio seria detetada porque o cookie na pilha não corresponderia mais ao cookie global.

Example

Considere o seguinte exemplo de DLL. O ponto de entrada DLL é definido como DllEntryPoint através do vinculador /ENTRY (Entry-Point Symbol) opção. 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 DllEntryPoint usa tratamento de exceção estruturado e, portanto, usa o cookie de segurança para detetar saturações de buffer. No momento em que a função DllInitialize é chamada, 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, DllEntryPoint não está protegido contra saturações de buffer (ele não tem buffers de cadeia de caracteres locais e não usa manipulação de exceção estruturada); portanto, ele pode chamar __security_init_cookiecom segurança . Em seguida, chama uma função auxiliar que está protegida.

Observação

A mensagem de erro R6035 só é gerada pela CRT de depuração x86 e apenas para tratamento de exceções estruturadas, mas a condição é um erro em todas as plataformas e para todas as formas de tratamento de exceções, como C++ EH.

Consulte também

Recursos de segurança no MSVC