Partilhar via


Erros R6035 (C Run-Time)

Biblioteca de tempo de execução Microsoft Visual C++, erro R6035 - um módulo neste aplicativo está inicializando o cookie global de segurança do módulo quando uma função que confia nessa cookie de segurança está ativa. Chame o __security_init_cookie anterior.

__security_init_cookie deve ser chamado antes do primeiro uso do cookie global de segurança.

O cookie global de segurança é usada para proteção de excesso de buffer em código compilado com /GS (verificação de segurança do buffer) e no código que usa a manipulação de exceção estruturados. Essencialmente, na entrada para uma função excedente- sombreada, o cookie é colocada na pilha, e na saída, o valor na pilha é comparado com o cookie global. Qualquer diferença entre eles indica que uma excesso de buffer ocorreu e resulta na terminação imediata de programa.

O erro R6035 indica que uma chamada a __security_init_cookie esteve feito depois que uma função protegida foi inserida. Se a execução for continuar, uma especulativo excesso de buffer será detectada porque o cookie na pilha não corresponderá ao cookie global.

Considere o exemplo da DLL. O ponto de entrada da DLL é definido como DllEntryPoint com a opção de /ENTRY (símbolo do ponto de entrada) do vinculador. Ele ignora a inicialização de CRT que inicializaria normalmente o cookie global de segurança, assim que o DLL próprio 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 a manipulação de exceção estruturados e usa como consequência o cookie de segurança para detectar que haja excesso de buffer. Antes de DllInitialize é chamado, o cookie global de segurança tiver sido colocada 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, DllEntryPoint não é protegido em excesso de buffer (não tem nenhum buffer local da cadeia de caracteres e não usa a manipulação de exceção estruturado); em virtude disso pode chamar com segurança __security_init_cookie. Chama uma função auxiliar que é protegida.

Dica

A mensagem de erro R6035 é gerado somente por CRT de depuração x86, e apenas para a manipulação de exceção estruturados, mas a condição é um erro em todas as plataformas, e para todos os formatos de manipulação de exceções, como C++ EH.

Consulte também

Outros recursos

Verificações de segurança do compilador detalhados