Freigeben über


Warnung C6059

Falscher Längenparameter beim Aufruf von "function". Übergeben Sie die Anzahl der neu Standard Zeichen, nicht die Puffergröße von "Variable".

Hinweise

Diese Warnung gibt an, dass ein Aufruf einer Zeichenfolgenverkettungsfunktion wahrscheinlich einen falschen Wert für die Anzahl der Zeichen übergibt, die verkettet werden sollen. Dieser Fehler kann zu einem ausnutzenden Pufferüberlauf oder Absturz führen. Eine häufige Ursache für diesen Fehler ist das Übergeben der Puffergröße (anstelle der neu Standard Anzahl von Zeichen im Puffer) an die Zeichenfolgenmanipulationsfunktion.

Diese Warnung hilft beim Identifizieren des häufig auftretenden Fehlers beim Senden der Größe des Zielpuffers anstelle der Größe der Daten. Dies geschieht, indem erkannt wird, wann die größe, die zum Zuordnen des Puffers verwendet wird, unverändert an die Funktion übergeben wird, die Daten in den Puffer eingibt.

Codeanalysename: BAD_CONCATENATION

Beispiel

Der folgende Code generiert Warnung 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 ...
}

Um diese Warnung zu korrigieren, verwenden Sie die richtige Anzahl von Zeichen, um zu verketten, wie im folgenden Code gezeigt:

#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 ...
}

Informationen zum Korrigieren dieser Warnung mithilfe der Funktionen strncpy_s für die sichere Zeichenfolgenmanipulation und strncat_sden folgenden Code finden Sie im folgenden Code:

#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;
}

Heuristik

Diese Analyse erkennt, wenn die Zielpuffergröße nicht in den Längenparameter der Zeichenfolgenmanipulationsfunktion übergeben wird. Diese Warnung wird nicht angegeben, wenn ein anderer Wert als Längenparameter übergeben wird, auch wenn dieser Wert falsch ist.

Beachten Sie den folgenden Code, der warnungscodierten C6059 generiert:

#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 ...
}

Die Warnung geht weg, indem Sie das MAX Argument strncatMAX - 1in "" ändern, obwohl die Längenberechnung noch falsch ist.

#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 ...
}

Siehe auch