Uyarı C6393
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 boyutunda arama tabloları genellikle belirli bir günün karşılık gelen ayı 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
Örnek
Aşağıdaki kod, yılda 365 gün olduğu varsayılarak yılın günü için bir arama tablosu oluşturur. Ancak, yıl artık yıl ise bu işe yaramaz:
#include <vector>
void foo(int year)
{
const std::vector<int> items(365); // C6393
// Initialize items and use it...
}
Sorunu düzeltmek için, uygun 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, sabit bir arama tablosunun 365 öğe için boyutlandırılıp boyutlandırılamadığını denetleyerek uygulanır. Bu kuralın ihlali yüksek güvenilirlik uyarısının bildirilmesine neden olur.