Предупреждение C6393
Таблица подстановки размером 365 недостаточно для обработки високосных лет
Это правило было добавлено в Visual Studio 2022 17.8.
Замечания
В григорианском календаре каждый год точно делится на четыре високосный год, за исключением лет, которые точно делятся на 100. Вековые годы также високосные годы, если они точно делятся на 400.
Ошибка високосного года возникает, когда программное обеспечение не учитывает логику этого високосного года или использует несовершенную логику. Это может повлиять на надежность, доступность или даже безопасность затронутой системы.
Таблицы подстановки размером 365 часто используются для быстрого поиска месяца в указанный день. Однако это не правильно, потому что високосный год имеет 366 дней.
Имя анализа кода: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP
Пример
Следующий код создает таблицу подстановки для дня года, при условии, что 365 дней в год. Однако это не работает, если год високосный год:
#include <vector>
void foo(int year)
{
const std::vector<int> items(365); // C6393
// Initialize items and use it...
}
Чтобы устранить проблему, настройте размер таблицы подстановки по мере создания таблицы в соответствии с результатом соответствующей проверки високосного года:
#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...
}
Эвристика
Это правило применяется путем проверки размера таблицы подстановки для 365 элементов. Нарушение этого правила приводит к возникновению предупреждения с высоким уровнем достоверности.