警告 C6393
大小为 365 的查找表不足以处理闰年
此规则是在 Visual Studio 2022 17.8 中添加的。
备注
在公历中,每个能被 4 整除的年份都是闰年,但能被 100 整除的年份除外。 如果百年年份能被 400 整除,那么它们也是闰年。
当软件未考虑此闰年逻辑或使用有缺陷的逻辑时,就会出现闰年 bug。 这可能会影响相关系统的可靠性、可用性甚至安全性。
大小为 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 个元素。 违反此规则会导致报告高置信度警告。