최근 수정 시각 : 2024-11-29 22:14:29

2022년 문제


1. 개요2. 설명3. 임시 해결책

1. 개요

2022년의 날짜를 "YYMMDDHHMM" 형식으로 저장 후 정수형으로 그대로 변환할 때 오버플로가 발생하는 버그. 업계에서는 이를 'Y2K22 버그'라고 부른다.[1]

2. 설명

예를 들어 2022년 1월 1일 0시 0분을 "YYMMDDHHmm" 형식으로 저장하면 "2201010000"이 된다. 이를 문자열 형태로 저장할 경우는 아무 문제가 되지 않지만 그대로 정수형으로 변환할 경우 2201010000이 되는데 이는 부호가 있는(signed) 32비트 정수형(C언어, C++, Java의 int형)의 최대값인 2147483647를 넘어서기 때문에 오버플로가 발생한다.

마이크로소프트 익스체인지 서버에서 이 버그가 발견되었으며 이메일이 정상적으로 전송되지 않는 버그가 발생했다. # 마이크로소프트는 문제가 발견되자 즉시 해결 방법을 내놓아 대처했다.

3. 임시 해결책

  • 문자열을 변환하지 않고 그대로 사용한다.
  • 변환이 필요한 경우에는 먼저 문자열을 년/월/일/시/분으로 나눈 뒤, 각각 따로 잘라서 변환한다. 참고로, C 언어에서 흔히 쓰는 struct tm 구조체는 해당 값을 각각 따로 저장한다.
  • 임시로 unsinged int 형으로 변경하여 사용한다. 이렇게 하면 2042년까지는 문제가 발생하지 않지만, 일시적인 해결일 뿐이며 2043년부터는 동일한 문제가 다시 발생한다.[2]

[1] 1999년에 발생한 Y2K 문제와 유사하다. 다만 2022년 문제는 Y2K 문제보다 사고 규모가 매우 작다.[2] 4212312359 < 4294967295 < 4301010000