Partilhar via


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çãoObservaçã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");

Consulte também

Referência

Recursos da biblioteca CRT

Conceitos

Recursos de segurança no CRT