Aracılığıyla paylaş


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_skullanarak 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 - 1olarak 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 ...
}

Ayrıca bkz.