C6053
avviso C6053: la chiamata a <funzione> non può terminare con zero la stringa <variabile>
L'avviso indica che la funzione specificata è stata chiamata in modo tale che la stringa risultante non possa terminare con zero.Questo problema potrebbe provocare un arresto anomalo o un sovraccarico del buffer.L'avviso viene anche generato se una funzione annotata prevede una stringa con terminazione null, e viene passata una stringa che non termina con valore null.
La maggior parte delle funzioni di gestione delle librerie standard in linguaggio C e delle stringhe Win32 richiedono e producono stringhe che terminano con zero.Alcune funzioni di 'stringa calcolata', incluse strncpy, wcsncpy, _mbsncpy, _snprintf e snwprintf, non producono stringhe che terminano con zero se occupano esattamente il relativo buffer.In tal caso, una chiamata successiva a una funzione di stringa che prevede una stringa che termina con zero supererà la fine del buffer alla ricerca del valore zero.Il programma dovrebbe accertarsi che la stringa termini con zero.In generale, si dovrebbe passare una lunghezza alla funzione 'stringa calcolata' di una dimensione più piccola rispetto alla dimensione del buffer e quindi esplicitare l'assegnazione a zero dell'ultimo carattere del buffer.
Esempio
Il seguente codice di esempio genera questo avviso:
#include <string.h>
#define MAX 15
size_t f( )
{
char szDest[MAX];
char *szSource="Hello, World!";
strncpy(szDest, szSource, MAX);
return strlen(szDest); // possible crash here
}
Per risolvere il problema, terminare la stringa con zero come indicato nel codice di esempio seguente:
#include <string.h>
#define MAX 15
size_t f( )
{
char szDest[MAX];
char *szSource="Hello, World!";
strncpy(szDest, szSource, MAX-1);
szDest[MAX-1]=0;
return strlen(szDest);
}
Il codice di esempio seguente risolve il problema utilizzando la funzione strncpy_s di modifica delle stringhe protette:
#include <string.h>
#define MAX 15
size_t f( )
{
char szDest[MAX];
char *szSource= "Hello, World!";
strncpy_s(szDest, sizeof(szDest), szSource, strlen(szSource));
return strlen(szDest);
}
Si noti che questo avviso viene talvolta visualizzato per alcuni linguaggi che nella pratica sono garantiti come protetti.Date la frequenza e le possibili conseguenze di questo errore, lo strumento di analisi viene indirizzato alla ricerca dei possibili problemi invece di seguire la tipica inclinazione a ridurre le segnalazioni.
Vedere anche
Riferimenti
strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l