Compartilhar via


Sobrecargas de modelo seguras

Muitas funções de CRT foram substituídas em favor de novas, versões de segurança aprimoradas (por exemplo, strcpy_s é mais seguro substituição para strcpy). O fornece CRT sobrecargas do modelo para ajudar a tornar a transição para as variantes mais seguros.

Por exemplo, esse código gerenciado como um aviso strcpy é preterido:

char szBuf[10];

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

Você pode ignorar o aviso. Define 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

As sobrecargas do modelo fornecem opções adicionais. Definir _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES a 1 habilita as sobrecargas do modelo de CRT padrão funções que chamam o mais seguro variantes automaticamente. Se _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES for 1, nenhuma alteração no código é necessária. Nos bastidores, a chamada para strcpy será alterado para uma chamada a 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_NAMES não afeta as funções que usam uma pontuação, como strncpy. Para habilitar sobrecargas do modelo para as funções de pontuação, defina como 1. _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT . Antes de fazer isso, no entanto, verifique se 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 no final do buffer depois da chamada de função é desnecessária se a variante segura é chamada. Se você precisar do comportamento de truncamento, consulte _TRUNCATE.

Dica

_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT macro requer que _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES também está definido como 1.Se _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT é definido como 1 e _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES está definido como 0, o aplicativo não executará nenhuma sobrecargas do modelo.

Definir _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES a 1 habilita sobrecargas do modelo das variantes seguras (nomes que terminam em “_s”). Nesse caso, se _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES for 1, então uma pequena alteração deve ser feita ao 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 do modelo terá 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 (desabilitado) e _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES é definido como 1 (habilitado).

Observe que estas sobrecargas do modelo só funcionam para matrizes estáticos. Os buffers alocados dinamicamente exigem alterações adicionais do código-fonte. Revisitando os exemplos anteriores:

#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