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