경고 C6059

'function'을 호출할 때 길이 매개 변수가 잘못되었습니다. 'variable'의 버퍼 크기가 아닌 다시 기본 문자 수를 전달합니다.

설명

이 경고는 문자열 연결 함수에 대한 호출이 연결할 문자 수에 대해 잘못된 값을 전달하고 있음을 나타냅니다. 이 결함으로 인해 악용 가능한 버퍼 오버런 또는 크래시가 발생할 수 있습니다. 이 결함의 일반적인 원인은 버퍼 크기(버퍼의 재기본 문자 수 대신)를 문자열 조작 함수에 전달하는 것입니다.

이 경고는 데이터 크기 대신 대상 버퍼의 크기를 보내는 일반적인 오류를 식별하는 데 도움이 됩니다. 이렇게 하려면 버퍼를 할당하는 데 사용되는 크기가 버퍼에 데이터를 배치하는 함수에 변경되지 않고 전달되는 시기를 감지합니다.

코드 분석 이름: BAD_CONCATENATION

예시

다음 코드는 경고 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 ...
}

이 경고를 수정하려면 다음 코드와 같이 올바른 수의 문자를 사용하여 연결합니다.

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

안전한 문자열 조작 함수 strncpy_sstrncat_s를 사용하여 이 경고를 수정하려면 다음 코드를 참조하세요.

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

경험적 학습

이 분석은 대상 버퍼 크기가 문자열 조작 함수의 길이 매개 변수에 수정되지 않은 상태로 전달되는 시기를 감지합니다. 다른 값이 길이 매개 변수로 전달되는 경우 해당 값이 올바르지 않더라도 이 경고는 제공되지 않습니다.

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

길이 계산이 여전히 올바르지 않더라도 인수를 strncatMAX - 1로 변경 MAX 하여 경고가 사라집니다.

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

참고 항목