Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Nesprávný parametr délky ve volání funkce. Předejte počet zbývajících znaků, nikoli velikost vyrovnávací paměti proměnné.
Poznámky
Toto upozornění indikuje, že volání funkce zřetězení řetězce pravděpodobně předává nesprávnou hodnotu počtu znaků ke zřetězení. Tato chyba může způsobit zneužitelné přetečení vyrovnávací paměti nebo chybové ukončení. Běžnou příčinou této chyby je předání velikosti vyrovnávací paměti (místo zbývajícího počtu znaků ve vyrovnávací paměti) do funkce pro manipulaci s řetězci.
Toto upozornění pomáhá identifikovat běžnou chybu při odesílání velikosti cílové vyrovnávací paměti místo velikosti dat. Provede to tak, že zjistí, kdy je velikost použitá k přidělení vyrovnávací paměti předána beze změny, funkci, která vkládá data do vyrovnávací paměti.
Název analýzy kódu: BAD_CONCATENATION
Příklad
Následující kód vygeneruje upozornění 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 ...
}
Chcete-li toto upozornění opravit, použijte správný počet znaků ke zřetězení, jak je znázorněno v následujícím kódu:
#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 ...
}
Pokud chcete toto upozornění opravit pomocí bezpečných funkcí strncpy_s pro manipulaci s řetězci, strncat_spodívejte se na následující kód:
#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;
}
Heuristika
Tato analýza zjistí, kdy se cílová velikost vyrovnávací paměti předá do parametru délky funkce pro manipulaci s řetězci. Toto upozornění není zadáno, pokud se jako parametr délky předá nějaká jiná hodnota, i když je tato hodnota nesprávná.
Představte si následující kód, který generuje upozornění 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 ...
}
Upozornění zmizí změnou argumentu MAX na strncat MAX - 1hodnotu , i když je výpočet délky stále nesprávný.
#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 ...
}