다음을 통해 공유


C6053

업데이트: 2007년 11월

C6053

경고 C6053: <function>에 대한 호출에서 <variable> 문자열이 0으로 종료되지 않을 수 있습니다.

이 경고는 지정된 함수를 결과 문자열이 0으로 종료되지 않을 수 있는 방식으로 호출했음을 나타냅니다. 이 오류로 인해 악용될 수 있는 버퍼 오버런이나 충돌이 발생할 수 있습니다. 또한 주석이 지정된 함수에서 Pre 조건에 NullTerminated 속성을 사용하여 null로 종료되는 문자열이 null로 종료되지 않는 문자열로 전달되도록 요구할 경우에도 이 경고가 발생할 수 있습니다.

대부분의 C 표준 라이브러리와 Win32 문자열 처리 함수에서는 0으로 종료되는 문자열을 요구하며 이러한 문자열을 만듭니다. strncpy, wcsncpy, _mbsncpy, _snprintf 및 snwprintf를 비롯한 일부 '계산되는 문자열' 함수에서는 버퍼가 정확하게 채워진 경우 0으로 종료되는 문자열을 만들지 않습니다. 이 경우 0으로 종료되는 문자열이 필요한 문자열 함수에 대한 이후의 호출은 0을 찾느라 버퍼의 끝을 벗어나게 됩니다. 따라서 프로그램에서는 문자열이 0으로 끝나는지 확인해야 합니다. 일반적으로 한 가지 유용한 방법은 '계산되는 문자열' 함수에 버퍼 크기보다 1만큼 작은 길이를 전달한 다음 버퍼의 마지막 문자에 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);
}

다음 코드에서는 주석을 사용하여 경고 C6053을 생성합니다.

#include<codeanalysis\sourceannotations.h>
using namespace vc_attributes;

void NotNullTerminatedStringReturned 
          (
           [Post(NullTerminated=No)] char* str
          )
{
  // code ...
}

void NullTerminatedStringRequired ([Pre(NullTerminated=Yes)] char* str)
{
  // code ...
}

void f (char* pC )
{
  NotNullTerminatedStringReturned(pC); //pC is not null terminated
  NullTerminatedStringRequired(pC); //requires null terminated pC
}

이 경고는 실제로 안전한 것이 확실한 특정 관용구에 대해서도 보고되는 경우가 있습니다. 이 오류의 빈도와 잠재적인 결과 때문에 분석 도구에서는 문제를 줄이기보다는 잠재적 문제를 찾는 데 더 중점을 둡니다.

참고 항목

개념

주석 개요

참조

NullTerminated

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l