Partilhar via


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.

Confira também

Recursos de segurança no MSVC