C6053
경고 C6053: <function>에 대한 호출에서 <variable> 문자열이 0으로 종료되지 않을 수 있습니다.
이 경고는 지정된 함수를 결과 문자열이 0으로 종료되지 않을 수 있는 방식으로 호출했음을 나타냅니다.이 오류로 인해 악용될 수 있는 버퍼 오버런이나 충돌이 발생할 수 있습니다.주석이 지정 된 함수는 null 종료 문자열 null이 아닌 문자열로 전달 경우에이 경고가 생성 됩니다 종료 되었습니다.
대부분의 C 표준 라이브러리와 Win32 문자열 처리 함수에서는 0으로 종료되는 문자열을 요구하며 이러한 문자열을 만듭니다.strncpy, wcsncpy, _mbsncpy, _snprintf 및 snwprintf를 비롯한 일부 '계산되는 문자열' 함수에서는 버퍼가 정확하게 채워진 경우 0으로 종료되는 문자열을 만들지 않습니다.이 경우 0으로 종료되는 문자열이 필요한 문자열 함수에 대한 이후의 호출은 0을 찾느라 버퍼의 끝을 벗어나게 됩니다.따라서 프로그램에서는 문자열이 0으로 끝나는지 확인해야 합니다.일반적으로 길이 버퍼의 크기 보다 작은 계산 되는 문자열' 함수에 하나를 전달 하 고 버퍼의 마지막 문자에 0을 명시적으로 할당 해야 합니다.
예제
다음 샘플 코드에서는 이 경고를 발생시킵니다.
#include <string.h>
#define MAX 15
size_t f( )
{
char szDest[MAX];
char *szSource="Hello, World!";
strncpy(szDest, szSource, MAX);
return strlen(szDest); // possible crash here
}
이 경고를 해결하려면 다음 샘플 코드에서처럼 문자열을 0으로 종료합니다.
#include <string.h>
#define MAX 15
size_t f( )
{
char szDest[MAX];
char *szSource="Hello, World!";
strncpy(szDest, szSource, MAX-1);
szDest[MAX-1]=0;
return strlen(szDest);
}
다음 샘플 코드에서는 안전한 문자열 조작 함수 strncpy_s를 사용하여 이 경고를 해결합니다.
#include <string.h>
#define MAX 15
size_t f( )
{
char szDest[MAX];
char *szSource= "Hello, World!";
strncpy_s(szDest, sizeof(szDest), szSource, strlen(szSource));
return strlen(szDest);
}
이 경고는 실제로 안전한 것이 확실한 특정 관용구에 대해서도 보고되는 경우가 있습니다.이 오류의 빈도와 잠재적인 결과 때문에 분석 도구에서는 문제를 줄이기보다는 잠재적 문제를 찾는 데 더 중점을 둡니다.
참고 항목
참조
strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l