Proteger Overloads de modelo
Muitas funções de CRT têm sido preteridas em favor de versões mais recentes, com segurança avançada (por exemplo, strcpy_s é o substituto mais seguro do strcpy).A CRT fornece sobrecargas de modelo para ajudar a facilitar a transição para as variantes mais seguras.
Por exemplo, esse código gera um aviso, porque strcpy está obsoleto:
char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated
Você pode ignorar esse aviso.Definir o símbolo _CRT_SECURE_NO_WARNINGS para suprimir o aviso ou atualizar o código para usar strcpy_s:
char szBuf[10];
strcpy_s(szBuf, 10, "test"); // security-enhanced _s function
Sobrecargas de modelo oferecem opções adicionais.Definindo _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES como 1 permite sobrecargas de modelo de funções de CRT padrão que chamam as variantes mais seguras automaticamente.Se _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES é 1, e em seguida, nenhuma alteração ao código é necessárias.Nos bastidores, a chamada para strcpy será alterado para uma chamada para strcpy_s com o argumento de tamanho fornecido automaticamente.
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
...
char szBuf[10];
strcpy(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMESnão afeta as funções que levam a uma contagem, como strncpy.Para habilitar as sobrecargas de modelo para as funções de contagem, definir _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT como 1.Antes disso, 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, código que grava explicitamente um terminador nulo do final do buffer após a chamada de função não é necessário se a variação segura for chamada.Se você precisar de comportamento 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 é definida como 1.Se _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT é definido como 1 e _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES é definido como 0, o aplicativo não executará qualquer sobrecargas de modelo. |
Definindo _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES como 1 permite sobrecargas de modelo das variantes do seguras (nomes terminados em "_s").Nesse caso, se _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES é 1, e em seguida, uma pequena alteração devem ser feita com o código original:
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
...
char szBuf[10];
strcpy_s(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")
Somente o nome da função precisa ser alterado (adicionando "_s"); a sobrecarga de modelo cuidará de fornecer o argumento de tamanho.
Por padrão, _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES e _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT são definidos como 0 (desativado) e _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES é definido como 1 (ativado).
Observe que esses modelo overloads funcionem apenas para arrays estáticos.Buffers alocados dinamicamente exigem alterações de código fonte adicional.Revisitando exemplos acima:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
...
char *szBuf = (char*)malloc(10);
strcpy(szBuf, "test"); // still deprecated; have to change to
// strcpy_s(szBuf, 10, "test");
E isso:
#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1
...
char *szBuf = (char*)malloc(10);
strcpy_s(szBuf, "test"); // doesn't compile; have to change to
// strcpy_s(szBuf, 10, "test");