C6057

경고 C6057: <function>에 대한 호출에서 문자 수/바이트 수가 일치하지 않아 버퍼 오버런이 발생했습니다.

이 경고는 문자 수가 필요한 함수에 바이트 수가 대신 전달된다는 것을 나타냅니다. 와이드(유니코드) 문자의 경우 값이 서로 다릅니다. 이 오류로 인해 악용될 수 있는 버퍼 오버런이나 충돌이 발생할 수 있습니다.

이 오류의 일반적인 원인은 문자 배열에 sizeof를 사용했기 때문입니다. sizeof 연산자는 항상 바이트 수를 계산합니다. ANSI 문자의 경우 바이트 수가 문자 수와 동일하지만 유니코드 문자의 경우 바이트 수는 문자 수의 두 배입니다.

일반적으로 배열의 크기를 각 요소의 크기로 나누어서 배열에 있는 요소의 수를 계산하는 것이 안전합니다.

예제

다음 코드에서는 유니코드 문자 집합을 사용하여 컴파일된 경우 이 경고를 발생시킵니다.

#include<tchar.h>
#include<windows.h>

void f( HINSTANCE hInst, UINT uID )
{
  TCHAR buff[128];
  if ( LoadString ( hInst, uID, buff, sizeof buff ) ) // warning C6057
  {
    // code...
  }
}

이 경고를 해결하려면 다음 코드에서처럼 배열의 크기를 요소의 크기로 나눕니다.

#include<tchar.h>
#include<windows.h>

void f(HINSTANCE hInst,UINT uID)
{
  TCHAR buff[128];
  if( LoadString ( hInst, uID, buff, (sizeof buff)/(sizeof buff[0]) ) )
  {
    // code...
  }
}

Visual C++에서 유니코드 문자를 사용하는 방법에 대한 자세한 내용은 일반 속성 페이지(프로젝트)를 참조하십시오. LoadString에 대한 자세한 내용은 LoadString Function을 참조하십시오.