Partilhar via


Proteger overloads de modelo

Muitas funções de CRT foram preterido em favor de versões mais recentes, com segurança avançado (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, este código gera um aviso porque strcpy está obsoleto:

char szBuf[10];

strcpy(szBuf, "test"); // warning: deprecated

Você pode ignorar o aviso, definem o símbolo _CRT_SECURE_NO_WARNINGS para eliminar 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.Definir _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 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 for 1, são necessárias sem alterações no código.Nos bastidores, a telefonar para strcpy será alterada para uma telefonar para strcpy_s com o argumento de dimensionar 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_NAMES não afeta sistema autônomo funções que realizar uma contagem, sistema autônomo funções strncpy.Para ativar o modelo sobrecargas para as funções de contagem, defina _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1.Antes de fazer isso, no entanto, certifique-se de que seu código passa a contagem de caracteres, não o dimensionar do buffer (um erro comum).Além disso, código que grava explicitamente um terminador nulo no participante do buffer após a telefonar de função desnecessária se a variação segura for telefonar.Se você precisar de truncamento de comportamento, consulte _TRUNCATE.

Definir _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1 permite sobrecargas de modelo de variantes do seguras (nomes terminados em "_s").Nesse caso, se _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES estiver 1, uma pequena alterar deve 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 dimensionar.

Por padrão, _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES e _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT são definidos sistema autônomo 0 (desabilitado) e _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES é definido sistema autônomo 1 (ativado).

Observe esses modelo sobrecargas trabalho apenas para arrays estático.Buffers alocados dinamicamente exigem alterações no código-fonte adicionais.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

Conceitos

Aprimoramentos de segurança no CRT

Referência

C em time de execução bibliotecas