컴파일러 경고 (수준 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
}