Uyarı C6059
'function' çağrısında yanlış uzunluk parametresi. 'değişken' arabellek boyutunu değil, kalan karakterlerin sayısını geçirin.
Açıklamalar
Bu uyarı, dize birleştirme işlevine yapılan çağrının birleştirilme karakterlerin sayısı için büyük olasılıkla yanlış bir değer geçirdiğini gösterir. Bu hata, yararlanılabilir arabellek taşmasına veya kilitlenmesine neden olabilir. Bu hatanın yaygın bir nedeni, arabellek boyutunu (arabellekteki kalan karakter sayısı yerine) dize işleme işlevine geçirmektir.
Bu uyarı, verilerin boyutu yerine hedef arabelleğin boyutunu göndermeye ilişkin yaygın hatanın belirlenmesine yardımcı olur. Bunu, arabelleğe veri koyan işleve, arabelleği ayırmak için kullanılan boyutun ne zaman geçirildiğini algılayarak yapar.
Kod analizi adı: BAD_CONCATENATION
Örnek
Aşağıdaki kod C6059 uyarısını oluşturur:
#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 ...
}
Bu uyarıyı düzeltmek için, aşağıdaki kodda gösterildiği gibi birleştirmek için doğru karakter sayısını kullanın:
#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 ...
}
Ve güvenli dize işleme işlevlerini strncpy_s
strncat_s
kullanarak bu uyarıyı düzeltmek için aşağıdaki koda bakın:
#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;
}
Buluşsal yöntemler
Bu analiz, hedef arabellek boyutunun dize işleme işlevinin uzunluk parametresine değiştirilmemiş olarak geçirildiğini algılar. Bu değer yanlış olsa bile uzunluk parametresi olarak başka bir değer geçirilirse bu uyarı verilmez.
Uyarı C6059 oluşturan aşağıdaki kodu göz önünde bulundurun:
#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 ...
}
Uyarı, uzunluk hesaplaması MAX
yine de yanlış olsa bile bağımsız değişkeni strncat
MAX - 1
olarak değiştirerek kaybolur.
#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 ...
}