Which is the difference between these two functions? I'm using MinGW 4.8.0.
I know that gmtime_r is thread safe ( but not secure if called multiple time from the same thread) but I don't understand gmtime_s
Which is the difference between these two functions? I'm using MinGW 4.8.0.
I know that gmtime_r is thread safe ( but not secure if called multiple time from the same thread) but I don't understand gmtime_s
The difference is that gmtime_r(3) is a standard SUSv2 function. The closest you can find to gmtime_r() on a windows environment is gmtime_s(), which has its arguments reversed:
gmtime_r(const time_t*, struct tm*) gmtime_s(struct tm*, const time_t*)Basically, they both convert a time value to a tm structure. gmtime_r then return a pointer to this structure (or NULL if failed), whereas gmtime_s returns 0 if successful, and a errno_t in case of failure.
The tm structure has the following body, as can be seen from both docs listed above:
struct tm {
int tm_sec; /* seconds */
int tm_min; /* minutes */
int tm_hour; /* hours */
int tm_mday; /* day of the month */
int tm_mon; /* month */
int tm_year; /* year */
int tm_wday; /* day of the week */
int tm_yday; /* day in the year */
int tm_isdst; /* daylight saving time */
};
gmtime_r and localtime_r are standard POSIX functions.
Their main purpose is thread safety (reentrancy). The basic gmtime and localtime functions aren't thread-safe or reentrant, because they use a single static area to store their results, so gmtime_r and localtime_r take pointers to where the results should be stored.
gmtime_s and localtime_s were introduced by Microsoft and are now part of C11, although non-Microsoft support is limited. (See here for further discussion.)
Their main purpose is security. They were added as part of Microsoft's Secure CRT (Secure C Run-Time). From what I understand, thread safety isn't an issue with gmtime and localtime in Microsoft's CRT, since these functions' static output areas are already allocated per thread. Instead, gmtime_s and localtime_s were added to do the Secure CRT's parameter validation. (In other words, they check if their parameters are NULL, in which case they invoke error handling.)