Aracılığıyla paylaş


Uyarı C6394

365 boyutunda bir arama tablosu artık yılları işlemek için yeterli değildir

Bu kural Visual Studio 2022 17.8'e eklendi.

Açıklamalar

Gregoryen takvimde, tam olarak dört ile bölünebilen her yıl, tam olarak 100 ile bölünebilen yıllar dışında artık yıldır. 400 ile tam olarak bölünebiliyorlarsa centurial yıllar da artık yıllardır.

Yazılım bu artık yıl mantığını hesaba eklemediğinde veya hatalı mantık kullandığında artık yıl hatası oluşur. , güvenilirlik, kullanılabilirlik ve hatta etkilenen sistemin güvenliğini etkileyebilir.

365 boyutundaki arama tabloları genellikle belirli bir günün karşılık gelen ayını vb. hızla bulmak için kullanılır. Ancak artık yılda 366 gün olduğundan bu doğru değildir.

Kod analizi adı: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP_MUTABLE

Örnek

Aşağıdaki kod, yılın günü için bir arama tablosu oluşturur, ancak yılda 365 gün olduğunu varsayar. Ancak, bu yanlış sonuç verir veya yıl artık yıl ise arama tablosunun sınır dışı erişimine neden olabilir:

#include <vector> 
  
void foo(int year) 
{ 
    std::vector<int> items(365);  // C6394 
    // Initialize items and use it... 
    // Another item may be added to the vector if year is a leap year, but this
    // rule doesn't check if that is the case.
}

Bu sorunu düzeltmek için, artık yıl denetiminin sonucuna göre tablo oluşturulurken arama tablosunun boyutunu ayarlayın:

#include <vector> 
  
void foo(int year) 
{ 
    bool isLeapYear = year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); 
    const std::vector<int> items(isLeapYear ? 366 : 365); 
    // Initialize items and use it... 
}

Buluşsal yöntemler

Bu kural, arama tablosunun ilk boyutunun 365 öğe olup olmadığını denetleyerek uygulanır, ancak 366'ya genişletilebilir. Ancak, tablonun boyutunun doğru artık yıl denetimiyle ayarlanıp ayarlanmadığını denetlemez ve bu da düşük güvenilirlik uyarısıdır.

Ayrıca bkz.

C6393
C26861
C26862
C26863
C26864