Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
A Microsoft descontinuou muitas funções da biblioteca de tempo de execução C (CRT) em favor de versões aprimoradas de segurança. Por exemplo, strcpy_s é o substituto mais seguro para strcpy. As funções preteridas são fontes comuns de bugs de segurança, porque não impedem operações que podem substituir a memória. Por padrão, o compilador produz um aviso de desaprovação quando se utiliza uma dessas funções. O CRT fornece sobrecargas de modelo C++ para essas funções para ajudar a facilitar a transição para as variantes mais seguras.
Por exemplo, esse trecho de código gera um aviso porque strcpy foi preterido:
char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated
O aviso de obsolescência está lá para dizer que o seu código pode não ser seguro. Se você verificou que seu código não pode substituir a memória, você tem várias opções. Você pode optar por ignorar o aviso, você pode definir o símbolo _CRT_SECURE_NO_WARNINGS antes das instruções include para os cabeçalhos CRT para suprimir o aviso, ou você pode atualizar seu código para usar strcpy_s:
char szBuf[10];
strcpy_s(szBuf, 10, "test"); // security-enhanced _s function
As sobrecargas de modelo fornecem mais opções. Se você definir _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES como 1, ele habilita sobrecargas de modelo de funções CRT padrão que chamam as variantes mais seguras automaticamente. Se _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES for 1, não são necessárias alterações ao seu código. Nos bastidores, a chamada para strcpy é alterada para uma chamada para strcpy_s com o argumento size fornecido automaticamente.
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
// ...
char szBuf[10];
strcpy(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
A macro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES não afeta as funções que fazem uma contagem, como strncpy. Para habilitar sobrecargas de modelo para as funções de contagem, defina _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT como 1. Antes de fazer isso, no entanto, certifique-se de que seu código passa a contagem de caracteres, não o tamanho do buffer (um erro comum). Além disso, o código que grava explicitamente um terminador nulo no final do buffer após a chamada de função é desnecessário se a variante segura for chamada. Se precisar da função de truncamento, consulte _TRUNCATE.
Observação
A macro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT requer que _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES também seja definida como 1. Se _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT for definido como 1 e _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES for definido como 0, o aplicativo não executará nenhuma sobrecarga de modelo.
Quando você define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES como 1, ele permite sobrecargas de modelo das variantes seguras (nomes terminados em "_s"). Neste caso, se _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES for 1, então uma pequena alteração deve ser feita no código original:
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
// ...
char szBuf[10];
strcpy_s(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
Apenas o nome da função precisa ser alterado (adicionando "_s"); A sobrecarga de modelo cuida de fornecer o argumento size.
Por padrão, _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES e _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT são definidos como 0 (desabilitado) e _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES é definido como 1 (habilitado).
As sobrecargas de modelo só funcionam para matrizes estáticas. Os buffers alocados dinamicamente exigem outras alterações no código-fonte. Revisitando os exemplos acima:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
// ...
char *szBuf = (char*)malloc(10);
strcpy(szBuf, "test"); // still deprecated; change it to
// strcpy_s(szBuf, 10, "test");
E este exemplo:
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
// ...
char *szBuf = (char*)malloc(10);
strcpy_s(szBuf, "test"); // doesn't compile; change it to
// strcpy_s(szBuf, 10, "test");
Ver também
Elementos de segurança na CRT
Ficheiros de tempo de execução de C (CRT) e C++ Standard Library (STL) .lib