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
.- Verificando
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, comogets
, 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ódigoerrno
, 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++