Udostępnij za pośrednictwem


Ostrzeżenie C6059

Niepoprawny parametr długości w wywołaniu funkcji . Przekaż liczbę pozostałych znaków, a nie rozmiar buforu zmiennej.

Uwagi

To ostrzeżenie wskazuje, że wywołanie funkcji łączenia ciągów prawdopodobnie przekazuje niepoprawną wartość liczby znaków do łączenia. Ta usterka może spowodować przekroczenie lub awarię buforu możliwego do wykorzystania. Częstą przyczyną tej wady jest przekazanie rozmiaru buforu (zamiast pozostałej liczby znaków w buforze) do funkcji manipulowania ciągami.

To ostrzeżenie pomaga zidentyfikować typowy błąd wysyłania rozmiaru buforu docelowego zamiast rozmiaru danych. Robi to, wykrywając, kiedy rozmiar używany do przydzielenia buforu jest przekazywany, bez zmian, do funkcji wprowadzania danych w buforze.

Nazwa analizy kodu: BAD_CONCATENATION

Przykład

Poniższy kod generuje ostrzeżenie 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 ...
}

Aby poprawić to ostrzeżenie, użyj poprawnej liczby znaków do połączenia, jak pokazano w poniższym kodzie:

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

Aby poprawić to ostrzeżenie przy użyciu funkcji strncpy_s bezpiecznego manipulowania ciągami i strncat_s, zobacz następujący kod:

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

Algorytmy heurystyczne

Ta analiza wykrywa, kiedy rozmiar buforu docelowego jest przekazywany niezmodyfikowany do parametru długości funkcji manipulowania ciągami. To ostrzeżenie nie jest podane, jeśli część innej wartości jest przekazywana jako parametr length, nawet jeśli ta wartość jest niepoprawna.

Rozważ następujący kod, który generuje ostrzeżenie 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 ...
}

Ostrzeżenie odchodzi przez zmianę argumentu MAX na strncat MAX - 1, mimo że obliczenie długości jest nadal niepoprawne.

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

Zobacz też