diff --git a/components/libc/time/clock_time.c b/components/libc/time/clock_time.c index 2c37272d89e51ac837f8ed218513c62a0772f3f1..6b91359ffe65c1c8287c847ccd093d1eb249929c 100644 --- a/components/libc/time/clock_time.c +++ b/components/libc/time/clock_time.c @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2012-12-08 Bernard fix the issue of _timevalue.tv_usec initialization, + * 2012-12-08 Bernard fix the issue of _timevalue.tv_usec initialization, * which found by Rob */ @@ -41,7 +41,7 @@ INIT_COMPONENT_EXPORT(clock_time_system_init); int clock_time_to_tick(const struct timespec *time) { int tick; - int nsecond, second; + long nsecond, second; struct timespec tp; RT_ASSERT(time != RT_NULL); @@ -54,7 +54,7 @@ int clock_time_to_tick(const struct timespec *time) if ((time->tv_nsec - tp.tv_nsec) < 0) { - nsecond = NANOSECOND_PER_SECOND - (tp.tv_nsec - time->tv_nsec); + nsecond = (long)NANOSECOND_PER_SECOND - (tp.tv_nsec - time->tv_nsec); second = time->tv_sec - tp.tv_sec - 1; } else @@ -63,7 +63,11 @@ int clock_time_to_tick(const struct timespec *time) second = time->tv_sec - tp.tv_sec; } - tick = second * RT_TICK_PER_SECOND + nsecond * RT_TICK_PER_SECOND / NANOSECOND_PER_SECOND; + /* + * Warning: NANOSECOND_PER_SECOND is unsigned long, division method instruction will be `divu`. + * so then result is overflow undefined behavior. + */ + tick = (int)(second * RT_TICK_PER_SECOND + (long)(nsecond * RT_TICK_PER_SECOND) / (long)NANOSECOND_PER_SECOND); if (tick < 0) tick = 0; } @@ -121,7 +125,7 @@ int clock_gettime(clockid_t clockid, struct timespec *tp) case CLOCK_REALTIME: { /* get tick */ - int tick = rt_tick_get(); + rt_tick_t tick = rt_tick_get(); tp->tv_sec = _timevalue.tv_sec + tick / RT_TICK_PER_SECOND; tp->tv_nsec = (_timevalue.tv_usec + (tick % RT_TICK_PER_SECOND) * MICROSECOND_PER_TICK) * 1000;