주기적으로 업데이트하기 위해서 시간을 비교하는 다음과 같은 코드가 있다.
void UpdatePeriodically(uint32_t currentTime)
{
static uint32_t prevTime = 0;
if(currentTime - prevTime < UPDATE_PERIOD)
{
return;
}
currentTime = prevTime;
}
이 코드는 아래의 코드로 바꿔도 똑같이 동작할 것 같지만...
void UpdatePeriodically(uint32_t currentTime)
{
static uint32_t prevTime = 0;
if(currentTime < UPDATE_PERIOD + prevTime)
{
return;
}
currentTime = prevTime;
}
다음과 같은 문제가 있음.
currentTime이 UINT32_MAX에 가까워지고,
currentTime = prevTime이 실행되면,
UPDATE_PERIOD + prevTime가 거의 UINT32_MAX에 근접하게 되고
currentTime에 오버플로우가 발생해서 다시 0부터 시작하면 문제가 발생함.
ms단위로 시간을 재는 함수를 이용했다면, 약 42일간 업데이트가 안이루어짐...
이게 진짜 잘 발생하지 않는 문제이긴 한데, 한 번 발생하면 잡기가 힘들다.
첫 번째 방식을 쓰면 currentTime에서 오버플로우가 발생하여 0부터 시작하더라도
두 변수 간의 차이를 계속 비교할 수 있음 ㅋ-ㅋ
최근에 라이브러리 쓰다가 이런 코드가 있길래 정리해봤음 ㅋ-ㅋ
추가로 찾아보고 싶으면 rollover를 키워드로 검색해보셈
오 ㅋㅋ
이런건 진짜 한번 호되게 당해보지 않는 이상 절대 안 보이더라
ㅋㅋ
ㄹㅇㅋㅋ
이거 봐봐야 한번 당하기 전에는 기억 못함 ㅋㅋ