컴파일러 경고(수준 1) C4789
N바이트 크기의 버퍼 'identifier'가 오버런 됩니다.M 바이트는 오프셋 L부터 작성됩니다.
설명
C4789 는 특정 CRT(C 런타임) 함수를 사용할 때 버퍼 오버런에 대해 경고합니다. 매개 변수가 전달되거나 할당이 수행될 때 크기 불일치를 보고할 수도 있습니다. 컴파일 시간에 데이터 크기를 알 수 있는 경우 경고가 발생할 수 있습니다. 이 경고는 일반적인 데이터 크기 불일치 검색을 방지할 수 있는 상황에 사용됩니다.
C4789 는 컴파일 시간에 너무 작은 것으로 알려진 데이터 블록에 데이터를 복사할 때 경고합니다.
이 경고는 복사본이 다음 CRT 함수 중 하나의 기본 형식을 사용하는 경우에 발생합니다.
매개 변수를 더 큰 데이터 형식으로 캐스팅한 다음 lvalue 참조에서 복사 할당을 수행할 때도 경고가 나타납니다.
Visual C++는 실행되지 않는 코드 경로에 대해 이 경고를 생성할 수 있습니다. 다음 예제와 같이 #pragma
를 사용하여 이 경고를 일시적으로 비활성화할 수 있습니다.
#pragma warning( push )
#pragma warning( disable : 4789 )
// unused code that generates compiler warning C4789`
#pragma warning( pop )
이 관용구는 Visual C++가 특정 코드 블록에 대한 경고를 생성하지 않도록 유지합니다. #pragma warning(push)
는 #pragma warning(disable: 4789)
에서 변경하기 전까지 기존 상태를 유지합니다. #pragma warning(pop)
는 푸시된 상태를 복원하고 #pragma warning(disable:4789)
의 효과를 제거합니다. C++ 전처리기 지시문에 대한 자세한 내용은 Pragma 지시문 #pragma
및 키워드를 __Pragma
참조 warning
하세요.
/sdl
(추가 보안 검사 사용) 컴파일러 옵션은 이 경고를 오류로 승격합니다.
예제
다음 샘플에서는 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;
int main()
{
int * p = (int *)&G;
*p = 3; // C4789 - writes an int through a pointer to short
}