다음을 통해 공유


경고 C6053

'function'에 대한 호출은 문자열 'variable'을 0으로 종료하지 않을 수 있습니다.

설명

이 경고는 결과 문자열이 0으로 종료되지 않을 수 있는 방식으로 지정된 함수가 호출되었음을 나타냅니다. 이 결함으로 인해 악용 가능한 버퍼 오버런 또는 크래시가 발생할 수 있습니다. 주석이 추가된 함수가 null로 끝나는 문자열을 예상하지만 null로 종료되지 않은 문자열을 전달하는 경우에도 이 경고가 생성됩니다.

대부분의 C 표준 라이브러리 및 Win32 문자열 처리 함수는 0으로 끝나는 문자열을 필요로 하고 생성합니다. 일부 'counted string' 함수(예strncpy: , wcsncpy, _mbsncpy_snprintfsnwprintf)는 버퍼를 정확히 채우는 경우 0으로 끝나는 문자열을 생성하지 않습니다. 이 경우 0으로 끝나는 문자열을 예상하는 문자열 함수에 대한 후속 호출은 버퍼의 끝을 넘어 0을 찾습니다. 프로그램에서 문자열이 0으로 끝나는지 확인해야 합니다. 일반적으로 버퍼 크기보다 작은 '계산되는 문자열' 함수에 길이를 전달하고 버퍼의 마지막 문자에 0을 명시적으로 할당해야 합니다.

코드 분석 이름: MISSING_ZERO_TERMINATION1

예제

다음 샘플 코드는 이 경고를 생성합니다.

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

경험적 학습

이 경고는 실제로 안전하도록 보장되는 특정 관용구에 보고되기도 합니다. 이 결함의 빈도 및 잠재적 결과 때문에 분석 도구는 노이즈를 줄이는 일반적인 편견 대신 잠재적인 문제를 찾는 데 유리하게 편향되어 있습니다.

참고 항목