Bagikan melalui


Peringatan Kompilator (Tingkat 1) C4789

buffer 'pengidentifikasi' ukuran N byte akan diserbu; Byte M akan ditulis mulai dari offset L

Keterangan

C4789 memperingatkan tentang overruns buffer ketika fungsi run-time (CRT) C tertentu digunakan. Ini juga dapat melaporkan ketidakcocokan ukuran ketika parameter diteruskan atau penugasan dibuat. Peringatan dimungkinkan jika ukuran data diketahui pada waktu kompilasi. Peringatan ini untuk situasi yang mungkin mengelabui deteksi ketidakcocokan ukuran data biasa.

C4789 memperingatkan ketika data disalin ke dalam blok data yang diketahui terlalu kecil pada waktu kompilasi.

Peringatan terjadi jika salinan menggunakan bentuk intrinsik dari salah satu fungsi CRT ini:

Peringatan juga muncul saat Anda mentransmisikan parameter ke jenis data yang lebih besar, lalu membuat penugasan salinan dari referensi lvalue.

Visual C++ mungkin menghasilkan peringatan ini untuk jalur kode yang tidak pernah dijalankan. Anda dapat menonaktifkan peringatan untuk sementara waktu dengan menggunakan #pragma, seperti yang ditunjukkan dalam contoh ini:

#pragma warning( push )
#pragma warning( disable : 4789 )
// unused code that generates compiler warning C4789`
#pragma warning( pop )

Idiom ini membuat Visual C++ tidak menghasilkan peringatan untuk blok kode tertentu tersebut. Mempertahankan #pragma warning(push) status yang ada sebelum #pragma warning(disable: 4789) mengubahnya. Memulihkan #pragma warning(pop) status yang didorong, dan menghapus efek dari #pragma warning(disable:4789). Untuk informasi selengkapnya tentang direktif #pragmapraproscessor C++, lihat warning dan Arahan Pragma dan __Pragma Kata Kunci.

/sdl Opsi kompilator (Aktifkan Pemeriksaan Keamanan Tambahan) meningkatkan peringatan ini menjadi kesalahan.

Contoh

Sampel berikut menghasilkan 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));
}

Sampel berikut juga menghasilkan 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
}