Overload di modelli sicuriSecure Template Overloads

Microsoft ha deprecato molte funzioni della libreria di runtime C (CRT) a favore di versioni con sicurezza avanzata.Microsoft has deprecated many C Runtime library (CRT) functions in favor of security-enhanced versions. strcpy_s, ad esempio, è la sostituzione più sicura per strcpy.For example, strcpy_s is the more secure replacement for strcpy. Le funzioni deprecate generano spesso errori di protezione, poiché non impediscono operazioni che possono comportare la sovrascrittura della memoria.The deprecated functions are common sources of security bugs, because they do not prevent operations that can overwrite memory. Per impostazione predefinita, il compilatore genera un avviso di deprecazione quando si usa una di queste funzioni.By default, the compiler produces a deprecation warning when you use one of these functions. CRT fornisce overload di modelli C++ per queste funzioni per semplificare la transizione alle varianti più sicure.The CRT provides C++ template overloads for these functions to help ease the transition to the more secure variants.

Questo snippet di codice, ad esempio, genera un avviso in quanto strcpy è deprecato:For example, this code snippet generates a warning because strcpy is deprecated:

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

L'avviso di deprecazione informa l'utente che il codice può non essere sicuro.The deprecation warning is there to tell you that your code may be unsafe. Dopo aver verificato che il codice non può sovrascrivere la memoria, sono disponibili varie opzioni.If you have verified that your code can't overwrite memory, you have several choices. È 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:You can choose to ignore the warning, you can define the symbol _CRT_SECURE_NO_WARNINGS before the include statements for the CRT headers to suppress the warning, or you can update your code to use strcpy_s:

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

Gli overload di modello forniscono scelte aggiuntive.The template overloads provide additional choices. La definizione di _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES su 1 abilita gli overload di modello delle funzioni CRT standard che chiamano automaticamente le varianti più sicure.If you define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES to 1, this enables template overloads of standard CRT functions that call the more secure variants automatically. Se _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES è 1, non sono necessarie modifiche al codice.If _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES is 1, then no changes to your code are necessary. La chiamata a strcpy viene modificata in una chiamata a strcpy_s con l'argomento di dimensione fornito automaticamente.Behind the scenes, the call to strcpy is changed to a call to strcpy_s with the size argument supplied automatically.

#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 interessa le funzioni che accettano un conteggio, come strncpy.The macro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES does not affect the functions that take a count, such as strncpy. Per abilitare gli overload di modello per le funzioni di conteggio, definire _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT su 1.To enable template overloads for the count functions, define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT to 1. Prima di eseguire questa operazione, tuttavia, assicurarsi che il codice passi il numero dei caratteri, non la dimensione del buffer (un errore comune).Before doing so, however, make sure that your code passes the count of characters, not the size of the buffer (a common mistake). 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.Also, code that explicitly writes a null terminator at the end of the buffer after the function call is unnecessary if the secure variant is called. Se è necessario il troncamento, vedere _TRUNCATE.If you need truncation behavior, see _TRUNCATE.

Nota

La macro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT necessita che anche _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES sia definito come 1.The macro _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT requires that _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES is also defined as 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.If _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT is defined as 1 and _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES is defined as 0, the application will not perform any template overloads.

La definizione di _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES su 1 abilita gli overload di modello delle varianti sicure (nomi che terminano in "_s").When you define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES to 1, it enables template overloads of the secure variants (names ending in "_s"). In questo caso, se _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES è 1, sarà necessario apportare una piccola modifica al codice originale:In this case, if _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES is 1, then one small change must be made to the original code:

#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.Only the name of the function needs to be changed (by adding "_s"); the template overload takes care of providing the size argument.

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).By default, _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES and _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT are defined as 0 (disabled) and _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES is defined as 1 (enabled).

Si noti che questi overload di modello funzionano solo per le matrici statiche.Note that these template overloads only work for static arrays. I buffer allocati dinamicamente richiedono modifiche aggiuntive al codice sorgente.Dynamically allocated buffers require additional source code changes. Rivedere gli esempi illustrati in precedenza:Revisiting the above examples:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1  

// ...  

char *szBuf = (char*)malloc(10);  
strcpy(szBuf, "test"); // still deprecated; you have to change it to  
                       // strcpy_s(szBuf, 10, "test");  

E questo:And this:

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1  

// ...  

char *szBuf = (char*)malloc(10);  
strcpy_s(szBuf, "test"); // doesn't compile; you have to change it to  
                         // strcpy_s(szBuf, 10, "test");  

Vedere ancheSee Also

Funzionalità di sicurezza in CRT Security Features in the CRT
CRT Library Features (Funzionalità della libreria CRT)CRT Library Features