Freigeben über


C6059

C6059

Warnung C6059: Falscher Längenparameter im Aufruf von <Funktion>. Übergeben Sie die Anzahl der verbleibenden Zeichen, nicht die Puffergröße von <Variable>.

Diese Warnung weist darauf hin, dass ein Aufruf von einer Funktion zur Zeichenfolgenverkettung wahrscheinlich einen falschen Wert für die Anzahl der zu verkettenden Zeichen übergibt. Dieser Fehler kann einen als Angriffspunkt geeigneten Pufferüberlauf oder einen Absturz verursachen. Eine mögliche Ursache dieses Fehlers liegt darin, dass anstelle der Anzahl der im Puffer verbleibenden Zeichen die Puffergröße an die Funktion zur Zeichenfolgenbearbeitung übergeben wird.

Beispiel

Der folgende Code generiert diese Warnung:

#include <string.h>
#define MAX 25

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

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

Um diese Warnung zu korrigieren, verwenden Sie die korrekte Anzahl der zu verkettenden Zeichen, wie im folgenden Code dargestellt:

#include <string.h>
#define MAX 25

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

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

  strncpy(szTarget,szCity,nTargetSize-1);
  szTarget[nTargetSize-1]=0;
  strncat(szTarget, szState, nTargetSize - strlen(szTarget));
  // code ...
  delete [] szTarget;
}

Im folgenden Code wird veranschaulicht, wie die Warnung mithilfe der Funktion zur sicheren Zeichenfolgenbearbeitung korrigiert wird:

#include <string.h>
#define MAX 25

void f( )
{
  char *szState ="Washington";
  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;
}

Siehe auch

Referenz

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l
strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l