Partilhar via


funcionalidades de segurança no CRT

Muitas funções de CRT antigas têm versões mais recentes e mais seguras. Se houver uma função segura, a versão mais antiga e menos segura será marcada como obsoleta. A nova versão tem o _s sufixo ("seguro").

Nesse contexto, "preterido" significa que o uso da função não é recomendado. Isso não significa que a função será removida do CRT.

As funções seguras não impedem nem corrigem erros de segurança. Em vez disso, elas detectam erros quando ocorrem. Eles fazem verificações extras para condições de erro. Se houver um erro, eles invocarão um manipulador de erros (consulte Validação de parâmetro).

Por exemplo, a strcpy função não pode dizer se a cadeia de caracteres copiada é muito grande para o buffer de destino. Sua contraparte segura, a strcpy_s, usa o tamanho do buffer como parâmetro. Assim, ele pode determinar se ocorrerá uma saturação de buffer. Se você usa strcpy_s para copiar 11 caracteres em um buffer de 10 caracteres, isso é um erro de sua parte; strcpy_s não é possível corrigir seu erro. Mas ela poderá detectar o erro e informá-lo invocando o manipulador de parâmetro inválido.

Eliminar avisos de depreciação

Há várias maneiras de eliminar os avisos de depreciação das funções mais antigas e menos seguras. O mais simples é simplesmente definir _CRT_SECURE_NO_WARNINGS ou usar o warning pragma. As duas opções desabilitarão os avisos de preterimento, mas as questões de segurança que dispararam os avisos ainda existirão. É melhor deixar os avisos de preterimento habilitados e tirar proveito dos novos recursos de segurança do CRT.

Em C++, a maneira mais fácil de eliminar os avisos de substituição é usar sobrecargas de modelo seguro. As sobrecargas eliminam avisos de substituição em muitos casos. Eles substituem chamadas para funções preteridas por chamadas para proteger versões das funções. Por exemplo, considere esta chamada preterida para strcpy:

char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated

A definição de _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES como 1 elimina o aviso alterando a chamada de strcpy para strcpy_s, o que impede estouros de buffer. Para obter mais informações, consulte Sobrecargas de modelo seguras.

Para as funções preteridas sem sobrecargas de modelo seguro, considere definitivamente a atualização manual do código a fim de usar as versões seguras.

Outra fonte de avisos de depreciação, não relacionados à segurança, são as funções POSIX. Substitua os nomes das funções POSIX por seus equivalentes padrão (por exemplo, alterar access para _access) ou desative os avisos de depreciação relacionados ao POSIX definindo _CRT_NONSTDC_NO_WARNINGS. Para obter mais informações, consulte Compatibilidade.

Mais recursos de segurança

Alguns dos recursos de segurança incluem:

  • Validação de parâmetro

    Funções seguras, e muitas de suas equivalentes não seguras, validam parâmetros. A validação pode incluir:

    • Verificando NULL valores.
    • Verificar a validade dos valores enumerados.
    • Verificar se os valores integrais estão em intervalos válidos.

    Para obter mais informações, consulte Validação de parâmetro.

    Um manipulador de parâmetros inválidos também é acessível ao desenvolvedor. Quando uma função encontra um parâmetro inválido, em vez de declarar e sair do aplicativo, o CRT permite que você verifique esses problemas por meio de _set_invalid_parameter_handler ou _set_thread_local_invalid_parameter_handler.

  • Buffers dimensionados

    Você deve passar o tamanho do buffer para qualquer função segura que grava em um buffer. As versões seguras validam se o buffer é grande o suficiente antes da gravação. A validação ajuda a evitar erros perigosos de saturação de buffer que podem permitir a execução de código mal-intencionado. Essas funções normalmente retornam um código de erro errno e invocam o manipulador de parâmetro inválido, se o tamanho do buffer for muito pequeno. Funções que leem de buffers de entrada, como gets, têm versões seguras que exigem a especificação de um tamanho máximo.

  • Terminação nula

    Algumas funções que deixavam cadeias de caracteres possivelmente não finalizadas têm versões seguras que garantem a terminação nula apropriada das cadeias de caracteres.

  • Relatório de erros aprimorado

    As funções seguras retornam códigos de erro com mais informações sobre o erro do que as funções preexistentes. Agora, as funções seguras, e muitas das funções preexistentes, definem errno, e geralmente também retornam um tipo de código errno, para fornecer melhores relatórios de erro.

  • Segurança do sistema de arquivos

    APIs de E/S de arquivo seguro oferecem suporte o acesso ao arquivo seguro no caso padrão.

  • Segurança do Windows

    APIs de processo seguro impõe políticas de segurança e permitem que as ACLs sejam especificadas.

  • Verificação de sintaxe de cadeia de caracteres de formato

    Cadeias de caracteres inválidas são detectadas, por exemplo, quando você usa caracteres de campo de tipo incorretos em printf cadeias de caracteres de formato.

Confira também

Validação de parâmetros
Proteger sobrecargas de modelo
Arquivos .lib de runtime do C (CRT) e Biblioteca Padrão (STL) do C++