Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
8 years, 5 months ago.
Year 2038 Bug: rtc_time.h and time.h, 32bit signed
I have been using mbed functions to set and read the RTC using the rtc_time.h interface. This seems to suffer from the year 2038 bug that results from using a 32bit signed int for time_t to count seconds. Max value of a 32bit signed int is 2,147,483,647. And I have confirmed that if I use set_time(2,147,483,647) the date is correctly set to Jan 19, 2038. But if I do set_time(2,147,483,648) the clock is not updated. The problem seems to be with definition of time_t inside time.h.
Sanity check, can someone confirm this is the case? The year 2038 is actually not that far away. It would be unacceptable then to use these functions in a real product. Is there any chance of getting the mbed libraries updated to fix this bug? Does anyone have a workaround?
1 Answer
8 years, 5 months ago.
in time.h
"typedef unsigned int time_t; /* date/time in unix secs past 1-Jan-70 */"
The Literal number you are using is signed
try
2,147,483,648u
The compiler will take the literal number as an unsigned integer
Yup, that was it, thanks. Follow up question then is, where does one find time.h that is being used in the online mbed compiler?
posted by 04 Apr 2016The online compiler uses ARMCC as its core. time.h and stdio.h etc are 'C standard libraries' which are used by this compiler. If you use an 'offline' compiler such as Keil (also using ARMCC) and the mbed-src (or mbed-dev) you will see time.h as part of the project structure if you 'include <time.h>' as a header file. Hope this helps.
posted by 04 Apr 2016