다음을 통해 공유


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