Aracılığıyla paylaş


Derleyici Uyarısı (Düzey 1) C4789

boyutu N bayt olan arabellek 'tanımlayıcısı' taşacak; M baytları, L uzaklığında başlayarak yazılır

Açıklamalar

C4789 , belirli C çalışma zamanı (CRT) işlevleri kullanıldığında arabellek taşmalarıyla ilgili uyarır. Ayrıca, parametreler geçirildiğinde veya atamalar yapıldığında boyut uyuşmazlıklarını bildirebilir. Veri boyutları derleme zamanında biliniyorsa uyarı mümkündür. Bu uyarı, tipik veri boyutu uyuşmazlığı algılamayı atlatabilecek durumlara yöneliktir.

C4789 , verilerin derleme zamanında çok küçük olduğu bilinen bir veri bloğuna kopyalandığında uyarır.

Kopya şu CRT işlevlerinden birinin iç biçimini kullanırsa uyarı oluşur:

Uyarı, parametreyi daha büyük bir veri türüne dönüştürüp bir lvalue başvurusundan kopya ataması yaptığınızda da görünür.

Visual C++ hiçbir zaman yürütülmeyecek bir kod yolu için bu uyarıyı oluşturabilir. Bu örnekte gösterildiği gibi kullanarak #pragmauyarıyı geçici olarak devre dışı bırakabilirsiniz:

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

Bu deyim, Visual C++'ın söz konusu kod bloğu için uyarı oluşturmasını engeller. , #pragma warning(push) mevcut durumu değiştirmeden önce #pragma warning(disable: 4789) korur. , #pragma warning(pop) gönderilen durumu geri yükler ve etkilerini #pragma warning(disable:4789)kaldırır. C++ ön işlemci yönergesi #pragmahakkında daha fazla bilgi için bkz warning . ve Pragma Yönergeleri ve __Pragma Anahtar Sözcük.

/sdl (Ek Güvenlik Denetimlerini Etkinleştir) derleyici seçeneği bu uyarıyı bir hataya yükseltir.

Örnekler

Aşağıdaki örnek C4789 oluşturur.

// 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));
}

Aşağıdaki örnek ayrıca C4789 oluşturur.

// 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
}