경고 C6393
365 크기의 조회 테이블은 윤년을 처리하기에 충분하지 않습니다.
이 규칙은 Visual Studio 2022 17.8에 추가되었습니다.
설명
그레고리오력에서는 매년 정확히 4개로 나눌 수 있으며, 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개 요소인지 확인하여 적용됩니다. 이 규칙을 위반하면 신뢰도 높은 경고가 보고됩니다.