Condividi tramite


Overload di modelli sicuri

Microsoft ha deprecato molte funzioni della libreria di runtime C (CRT) a favore di versioni con sicurezza avanzata. strcpy_s, ad esempio, è la sostituzione più sicura per strcpy. Le funzioni deprecate sono origini comuni di bug di sicurezza, perché non impediscono operazioni che possono sovrascrivere la memoria. Per impostazione predefinita, il compilatore genera un avviso di deprecazione quando si usa una di queste funzioni. CRT fornisce overload di modelli C++ per queste funzioni per semplificare la transizione alle varianti più sicure.

Questo snippet di codice, ad esempio, genera un avviso in quanto strcpy è deprecato:

char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated

L'avviso di deprecazione informa l'utente che il codice può non essere sicuro. Se si è verificato che il codice non può sovrascrivere la memoria, sono disponibili diverse opzioni. È possibile scegliere di ignorare l'avviso, di eliminare l'avviso definendo il simbolo _CRT_SECURE_NO_WARNINGS prima delle istruzioni include per le intestazioni CRT oppure di aggiornare il codice in modo da usare strcpy_s:

char szBuf[10];
strcpy_s(szBuf, 10, "test"); // security-enhanced _s function

Gli overload del modello offrono più opzioni. Se si definisce _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES su 1, abilita gli overload di modelli di funzioni CRT standard che chiamano automaticamente le varianti più sicure. Se _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES è 1, non sono necessarie modifiche al codice. La chiamata a strcpy viene modificata in una chiamata a strcpy_s con l'argomento di dimensione fornito automaticamente.

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

// ...

char szBuf[10];
strcpy(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")

La macro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES non influisce sulle funzioni che accettano un conteggio, ad esempio strncpy. Per abilitare gli overload di modello per le funzioni di conteggio, definire _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT su 1. Prima di eseguire questa operazione, tuttavia, assicurarsi che il codice passi il numero dei caratteri, non la dimensione del buffer (un errore comune). Inoltre, il codice che scrive esplicitamente una terminazione null alla fine del buffer dopo la chiamata di funzione non è necessario se viene chiamata la variante sicura. Se è necessario un comportamento di troncamento, vedere _TRUNCATE.

Nota

La macro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT necessita che anche _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES sia definito come 1. Se _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT è definito come 1 e _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES è definito come 0, l'applicazione non eseguirà alcun overload di modello.

La definizione di _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES su 1 abilita gli overload di modello delle varianti sicure (nomi che terminano in "_s"). In questo caso, se _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES è 1, sarà necessario apportare una piccola modifica al codice originale:

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1

// ...

char szBuf[10];
strcpy_s(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")

Solo il nome della funzione deve essere modificato (aggiungendo "_s"); l'overload di modello si occuperà di fornire l'argomento di dimensione.

Per impostazione predefinita, _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES e _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT sono definiti come 0 (disabilitato) e _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES è definito come 1 (abilitato).

Gli overload del modello funzionano solo per le matrici statiche. I buffer allocati dinamicamente richiedono altre modifiche al codice sorgente. Rivedere gli esempi illustrati in precedenza:

#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 questo esempio:

#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");

Vedi anche

Funzionalità di sicurezza in CRT
File C Runtime (CRT) e C++ Standard Library (STL) .lib