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.