Uyarı C6201
'dizin-adı' dizini, büyük olasılıkla yığın tarafından ayrılan 'değişken' arabelleği için geçerli 'minimum' ile 'maksimum' dizin aralığının dışında
Bu uyarı, belirtilen yığın dizisine bir tamsayı uzaklığının bu dizinin maksimum sınırlarını aştığını gösterir. Yığın taşması hatalarına, tanımsız davranışlara veya kilitlenmelere neden olabilir.
Açıklamalar
Bu hatanın yaygın nedenlerinden biri dizinin boyutunu dizide dizin olarak kullanmaktır. C/C++ dizi dizini sıfır tabanlı olduğundan, bir dizideki yasal dizin üst sınırı dizi öğelerinin sayısından azdır.
Kod analizi adı: INDEX_EXCEEDS_MAX
Örnek
Aşağıdaki kod C6201 uyarısını oluşturur. Döngü for
koşulu, 14'e ayarlandığı i
zaman için buff
geçerli dizin aralığını aşıyor ve bu da ucu aşan bir öğedir:
void f()
{
int buff[14]; // array of 0..13 elements
for (int i = 0; i <= 14; i++) // i == 14 exceeds the bounds
{
buff[i] = 0; // initialize buffer
}
}
Uyarıyı düzeltmek için dizinin sınırlarda kaldığından emin olun. Aşağıdaki kod düzeltilen döngü koşulunu gösterir:
void f()
{
int buff[14]; // array of 0..13 elements
for (int i = 0; i < 14; i++) // i == 13 on the final iteration
{
buff[i]= 0; // initialize buffer
}
}
Buluşsal yöntemler
Bu çözümleme yığına ayrılmış dizilerle sınırlıdır. Örneğin, işleve Microsoft kaynak kodu ek açıklama dili (SAL) açıklamalı uzunlukla geçirilen dizileri dikkate almaz.
Tüm aritmetikler hassas bir şekilde analiz edilemediğinden, bu analiz sınır dışı dizinlerin tümünü yakalayamaz. Sınır dışı dizininin mümkün olduğunu garanti edebildiği durumları rapor etmek için ayarlanır. Uyarı olmaması, dizinin sınırlarda olması garantili olduğu anlamına gelmez.