경고 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_s
strncat_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 ...
}
길이 계산이 여전히 올바르지 않더라도 인수를 strncat
MAX - 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 ...
}