Share via


C6053

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é NullTerminated de sa condition Pre.

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!";

  // if strlen(szSource) > MAX, szDest will not be zero-terminated
  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);
}

Le code suivant utilise l'annotation pour générer l'avertissement C6053 :

#include<codeanalysis\sourceannotations.h>
using namespace vc_attributes;

void NotNullTerminatedStringReturned 
          (
           [Post(NullTerminated=No)] char* str
          )
{
  // code ...
}

void NullTerminatedStringRequired ([Pre(NullTerminated=Yes)] char* str)
{
  // code ...
}

void f (char* pC )
{
  NotNullTerminatedStringReturned(pC); //pC is not null terminated
  NullTerminatedStringRequired(pC); //requires null terminated pC
}

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

NullTerminated
strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

Concepts

Vue d'ensemble de l'annotation