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.)