다음을 통해 공유


컴파일러 경고 (수준 1) C4789

메모리 복사 대상이 너무 작습니다.

특정 CRT(C 런타임) 함수가 사용되는 경우 버퍼 오버런에 대해 경고합니다. 컴파일 타임에 데이터 크기를 알 수 있도록 매개 변수가 전달되고 할당이 수행됩니다. 이 경고는 일반적인 데이터 크기 불일치 검색이 적용되지 않는 경우에 사용됩니다.

길이가 컴파일 타임에 알려진 데이터를 복사한 다음 컴파일 타임에 크기가 데이터에 비해 너무 작은 것이 알려진 데이터 블록에 넣는 경우 이 경고가 표시됩니다. 다음 CRT 함수 중 하나의 내장 형식을 사용하여 복사해야 합니다.

매개 변수 데이터 형식이 캐스트를 사용하여 불일치되었으며 lvalue 참조의 복사 할당이 시도된 경우에도 이 경고가 표시됩니다.

Visual C++에서 실행되지 않는 코드 경로에 대해 이 경고를 생성할 수도 있습니다. 다음 예제와 같이 #pragma를 사용하여 경고를 일시적으로 사용하지 않도록 설정할 수 있습니다.

#pragma(push)

#pragma warning ( disable : 4789 )

// unused code that generates compiler warning C4789

#pragma(pop)

이렇게 하면 Visual C++에서 특정 코드 블록에 대해 경고를 생성하지 않습니다. #pragma(push)는 #pragma warning(disable: 4789)에서 변경하기 전의 기존 상태를 유지합니다. #pragma(pop)는 푸시된 상태를 복원하고 #pragma warning(disable:4789)의 영향을 제거합니다. C++ 전처리기 지시문 #pragma에 대한 자세한 내용은 경고Pragma 지시문 및 __Pragma 키워드를 참조하십시오.

예제

다음 샘플에서는 C4789 오류가 발생하는 경우를 보여 줍니다.

// C4789.cpp
// compile with: /Oi /W1 /c
#include <string.h>
#include <stdio.h>

int main() 
{
    char a[20];
    strcpy(a, "0000000000000000000000000\n");   // C4789

    char buf2[20];
    memset(buf2, 'a', 21);   // C4789

    char c;
    wchar_t w = 0;
    memcpy(&c, &w, sizeof(wchar_t));
}

다음 샘플에서도 C4789 오류가 발생하는 경우를 보여 줍니다.

// C4789b.cpp
// compile with: /W1 /O2 /c
// processor: x86
short G;

void main()
{
  int * p = (int *)&G; 
  *p = 3;   // C4789
}