C6053
avertissement C6053 : l'appel à <fonction> peut ne pas terminer la chaîne <variable> par zéro
Cet avertissement indique que la fonction spécifiée a été appelée de telle sorte que la chaîne obtenue ne puisse pas se terminer par zéro.Ce défaut peut provoquer un blocage ou un dépassement de mémoire tampon exploitable.Cet avertissement est également généré si une fonction annotée s'attend à ce qu'une chaîne qui ne se termine pas par null soit passée à une chaîne qui se termine par null à l'aide de la propriété de sa condition .
La plupart des fonctions de bibliothèques standard C et de manipulation de chaînes Win32 requièrent et produisent des chaînes se terminant par zéro.Quelques fonctions 'counted string' (y compris strncpy, wcsncpy, _mbsncpy, _snprintf et snwprintf) ne produisent pas de chaînes se terminant par zéro si elles remplissent exactement leur mémoire tampon.Dans ce cas, un appel suivant d'une fonction de chaîne qui attend une chaîne se terminant par zéro va au-delà de la fin de la mémoire tampon pour rechercher la valeur zéro.Le programme doit vérifier que la chaîne se termine par zéro.En général, une approche utile consiste à passer à la fonction 'counted string' une longueur plus petite que la taille de la mémoire tampon, puis à assigner explicitement la valeur zéro au dernier caractère dans la mémoire tampon.
Exemple
L'exemple de code suivant génère cet avertissement :
#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
}
Pour corriger cet avertissement, terminez la chaîne par zéro comme indiqué dans l'exemple de code suivant :
#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);
}
L'exemple de code suivant corrige cet avertissement à l'aide de la fonction strncpy_s de manipulation de chaînes sécurisée :
#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);
}
Notez que cet avertissement est parfois indiqué sur certains idiomes considérés comme sécurisés dans la pratique.En raison de la fréquence et des conséquences potentielles de ce défaut, l'outil d'analyse tend à rechercher des problèmes potentiels au lieu de son écart classique de réduction du bruit.
Voir aussi
Référence
strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l