Avertissement C6059

Paramètre de longueur incorrect dans l’appel à 'function'. Transmettez le nombre de caractères restants, et non la taille de la mémoire tampon de « variable ».

Notes

Cet avertissement indique qu’un appel à une fonction de concaténation de chaîne transmet probablement une valeur incorrecte pour le nombre de caractères à concaténer. Ce défaut peut entraîner un dépassement ou un incident de mémoire tampon exploitable. Une cause courante de ce défaut consiste à passer la taille de la mémoire tampon (au lieu du nombre restant de caractères dans la mémoire tampon) à la fonction de manipulation de chaîne.

Cet avertissement permet d’identifier l’erreur courante lors de l’envoi de la taille de la mémoire tampon cible au lieu de la taille des données. Il le fait en détectant quand la taille utilisée pour allouer la mémoire tampon est passée, inchangée, à la fonction plaçant des données dans la mémoire tampon.

Nom de l’analyse du code : BAD_CONCATENATION

Exemple

Le code suivant génère l’avertissement C6059 :

#include <string.h>
#define MAX 25

void f( )
{
  char szTarget[MAX];
  const char *szState ="Washington";
  const char *szCity="Redmond, ";

  strncpy(szTarget, szCity, MAX);
  szTarget[MAX -1] = '\0';
  strncat(szTarget, szState, MAX); // wrong size
  // code ...
}

Pour corriger cet avertissement, utilisez le nombre correct de caractères pour concaténer, comme indiqué dans le code suivant :

#include <string.h>
#define MAX 25

void f( )
{
  char szTarget[MAX];
  const char *szState ="Washington";
  const char *szCity="Redmond, ";

  strncpy(szTarget, szCity, MAX);
  szTarget[MAX -1] = '\0';
  strncat(szTarget, szState, MAX - strlen(szTarget)); // correct size
  // code ...
}

Pour corriger cet avertissement à l’aide des fonctions strncpy_s de manipulation de chaîne sécurisée et strncat_s, consultez le code suivant :

#include <string.h>

void f( )
{
  const char *szState ="Washington";
  const char *szCity="Redmond, ";

  size_t nTargetSize = strlen(szState) + strlen(szCity) + 1;
  char *szTarget= new char[nTargetSize];

  strncpy_s(szTarget, nTargetSize, szCity, strlen(szCity));
  strncat_s(szTarget, nTargetSize, szState,
                    nTargetSize - strlen(szTarget));
  // code ...
  delete [] szTarget;
}

Heuristique

Cette analyse détecte quand la taille de la mémoire tampon cible est passée non modifiée dans le paramètre de longueur de la fonction de manipulation de chaîne. Cet avertissement n’est pas donné si une autre valeur est passée en tant que paramètre de longueur, même si cette valeur est incorrecte.

Considérez le code suivant qui génère l’avertissement C6059 :

#include <string.h>
#define MAX 25

void f( )
{
  char szTarget[MAX];
  const char *szState ="Washington";
  const char *szCity="Redmond, ";

  strncpy(szTarget, szCity, MAX);
  szTarget[MAX -1] = '\0';
  strncat(szTarget, szState, MAX); // wrong size
  // code ...
}

L’avertissement disparaît en remplaçant l’argument MAXstrncatMAX - 1par , même si le calcul de longueur est toujours incorrect.

#include <string.h>
#define MAX 25

void f( )
{
  char szTarget[MAX];
  const char *szState ="Washington";
  const char *szCity="Redmond, ";

  strncpy(szTarget, szCity, MAX);
  szTarget[MAX -1] = '\0';
  strncat(szTarget, szState, MAX - 1); // wrong size, but no warning
  // code ...
}

Voir aussi