다음을 통해 공유


경고 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개 요소인지 확인하여 적용됩니다. 이 규칙을 위반하면 신뢰도 높은 경고가 보고됩니다.

참고 항목

C6394
C26861
C26862
C26863
C26864