Funzionalità di sicurezza in CRT
Molte funzioni CRT precedenti hanno versioni più sicure e recenti. Se esiste una funzione sicura, la versione meno sicura precedente viene contrassegnata come deprecata. La nuova versione ha il _s
suffisso ("secure").
In questo contesto, "deprecato" significa che l'uso della funzione non è consigliato. Non significa che la funzione verrà rimossa da CRT.
Le funzioni sicure non impediscono o correggeno gli errori di sicurezza. Rilevano invece gli errori quando si verificano. Eseguono controlli aggiuntivi per verificare le condizioni di errore. Se si verifica un errore, richiamano un gestore errori (vedere Convalida dei parametri).
Ad esempio, la strcpy
funzione non è in grado di stabilire se la stringa copiata è troppo grande per il buffer di destinazione. La controparte sicura, strcpy_s
, accetta le dimensioni del buffer come parametro. Può quindi determinare se si verificherà un sovraccarico del buffer. Se si usa strcpy_s
per copiare 11 caratteri in un buffer di 10 caratteri, si tratta di un errore da parte dell'utente. strcpy_s
Non è possibile correggere l'errore. Ma può rilevare l'errore e informare l'utente richiamando il gestore di parametri non validi.
Eliminazione degli avvisi di deprecazione
Esistono diversi modi per eliminare gli avvisi di deprecazione per le funzioni precedenti, meno sicure. Il più semplice consiste semplicemente nel definire _CRT_SECURE_NO_WARNINGS
o usare il warning
pragma. Entrambi disabilitano gli avvisi di deprecazione, ma i problemi di sicurezza che hanno causato gli avvisi esistono ancora. È preferibile lasciare abilitati gli avvisi di deprecazione e sfruttare le nuove funzionalità di sicurezza CRT.
In C++, il modo più semplice per eliminare gli avvisi di deprecazione consiste nell'usare overload di modelli sicuri. Gli overload eliminano gli avvisi di deprecazione in molti casi. Sostituiscono le chiamate alle funzioni deprecate con chiamate per proteggere le versioni delle funzioni. Ad esempio, considerare la chiamata deprecata a strcpy
:
char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated
Definendo _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
come 1, viene eliminato l'avviso modificando la chiamata strcpy
a strcpy_s
, che evita sovraccarichi del buffer. Per altre informazioni, vedere Proteggere gli overload dei modelli.
Per queste funzioni deprecate senza overload dei modelli sicuri, è necessario considerare la possibilità di aggiornare manualmente il codice per utilizzare le versioni sicure.
Un'altra origine degli avvisi di deprecazione, indipendente dalla sicurezza, sono le funzioni POSIX. Sostituire i nomi delle funzioni POSIX con i relativi equivalenti standard (ad esempio, passare access
a ) o disabilitare gli avvisi di deprecazione correlati a _access
POSIX definendo _CRT_NONSTDC_NO_WARNINGS
. Per altre informazioni, vedere Compatibility.
Altre funzionalità di sicurezza
Alcune delle funzionalità di sicurezza includono:
Convalida dei parametri
Funzioni sicure e molte delle relative controparti non sicure, convalidano i parametri. La convalida può includere:
- Controllo dei
NULL
valori. - Verifica dei valori enumerati per la validità.
- Verifica che i valori integrali siano in intervalli validi.
Per altre informazioni, vedere Convalida dei parametri.
Un gestore per i parametri non validi è accessibile anche allo sviluppatore. Quando una funzione rileva un parametro non valido, anziché asserire e uscire dall'applicazione, CRT consente di controllare questi problemi tramite
_set_invalid_parameter_handler
o_set_thread_local_invalid_parameter_handler
.- Controllo dei
Buffer ridimensionati
È necessario passare le dimensioni del buffer a qualsiasi funzione sicura che scrive in un buffer. Le versioni sicure convalidano che il buffer sia sufficientemente grande prima di scrivervi. La convalida consente di evitare errori pericolosi di sovraccarico del buffer che potrebbero consentire l'esecuzione di codice dannoso. Queste funzioni in genere restituiscono un
errno
codice di errore e richiamano il gestore di parametri non validi se le dimensioni del buffer sono troppo piccole. Le funzioni che leggono da buffer di input, comegets
, dispongono di versioni sicure che richiedono di specificare una dimensione massima.Terminazione Null
Alcune funzioni che hanno lasciato stringhe potenzialmente non terminate hanno versioni sicure, assicurandosi che le stringhe vengano terminate correttamente con null.
Segnalazione errori avanzata
Le funzioni sicure restituiscono codici di errore con più informazioni sugli errori rispetto a quelle disponibili con le funzioni preesistenti. Le funzioni sicure e molte delle funzioni preesistenti ora impostate
errno
e spesso restituiscono anche unerrno
tipo di codice, per fornire una segnalazione degli errori migliore.Sicurezza del file system
Le API di I/O di file sicuri supportano l'accesso sicuro ai file nel caso predefinito.
Sicurezza di Windows
Le API di processo sicuro rafforzano i criteri di sicurezza e consentono agli ACL di essere specificati.
Controllo della sintassi della stringa di formato
Vengono rilevate stringhe non valide, ad esempio quando si usano caratteri di campo di tipo non corretti nelle
printf
stringhe di formato.
Vedi anche
Convalida dei parametri
Overload di modelli sicuri
File C Runtime (CRT) e C++ Standard Library (STL) .lib