Freigeben über


Warnung C6059

Falscher Längenparameter beim Aufruf von "function". Übergeben Sie die Anzahl der verbleibenden 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 besteht darin, die Puffergröße (anstelle der verbleibenden Anzahl von Zeichen im Puffer) an die Zeichenfolgenbearbeitungsfunktion zu übergeben.

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.

Name der Codeanalyse: 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 strncat MAX - 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