Compartilhar via


C erro em tempo de execução R6035

Mensagem de erro

Microsoft Visual C++ tempo de execução biblioteca, R6035 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á ativo.Chame __security_init_cookie anteriormente.

__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 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 protegida por saturação, o cookie é colocado na pilha e na sair, o valor na pilha é comparado com o cookie global.Qualquer diferença entre eles indica que uma saturação de buffer ocorreu e resultados em desligamento imediato do programa.

Erro R6035 indica que uma telefonar para __security_init_cookie foi feita depois que uma função protegida foi inserida. Se execução continuar, uma saturação de buffer artificiais poderia ser detectada porque o cookie na pilha seria não corresponde ao cookie global.

Considere o seguinte exemplo DLL.O ponto de entrada DLL é definido como DllEntryPoint através do vinculador de / ENTRADA (símbolo de ponto de entrada) opção. Isso ignora a inicializar do CRT que normalmente seria inicializar o cookie de segurança global, para que a DLL propriamente dito deve telefonar __security_init_cookie.

// Wrong way to call __security_init_cookie
DllEntryPoint(...) {
   DllInitialize();
   ...
   __try {
      ...
   } __except()... {
      ...
   }
}

void DllInitialize() {
   __security_init_cookie();
}

Este exemplo irá gerar erro R6035 como DllEntryPoint usa o tratamento de exceção estruturada e, portanto, usa o cookie de segurança para detectar saturações de buffer.No momento 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, DllEntryPoint não está protegido contra as 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 ele pode chamar com segurança __security_init_cookie. Em seguida, ele chama uma função auxiliar que esteja protegida.

Observação:

Mensagem de erro R6035 for gerada somente pela depurar de x86 CRT e apenas para a manipulação de exceção estruturada, mas a condição é um erro em todas sistema autônomo plataformas e para todos sistema autônomo formulários de manipulação de exceção, sistema autônomo C++ EH.

Consulte também

Referência

Verificações de segurança do compilador em profundidade