Aracılığıyla paylaş


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.