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 #pragma
uyarı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 #pragma
hakkı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
}