> Suppose you create a struct tm _without_ gmtime(3) or localtime(3),
> using designated initializers or memset for zero-initialization, with
> only what is included in POSIX:

> struct tm tm = {
>       .tm_sec = 56,
>       .tm_min = 34,
>       .tm_hour = 12,
>       .tm_mday = 1,
>       .tm_mon = 12 - 1,       /* December */
>       .tm_year = 2021 - 1900,
>       .tm_wday = 3,           /* Wednesday */
>       .tm_yday = 334,         /* zero-based day of year (%j - 1) */
>       .tm_isdst = 0,
> };

This is fine.  But using memset is not; if struct tm contains a pointer
or a floating-point value, setting it to all-0-bits may produce a trap
representation - or, possibly worse, a valid value that means something
different from what you intend.

Unless POSIX was stupid enough to mandate that all-bits-0 is nil for
any pointer type and something well-defined for floating-point.  (I'd
be surprised by that, but standards bodies have surprised me often
enough in the past.)  Certainly C doesn't, at least not as of C99 - I
don't have a copy of anything newer.

/~\ The ASCII                             Mouse
\ / Ribbon Campaign
 X  Against HTML                mo...@rodents-montreal.org
/ \ Email!           7D C8 61 52 5D E7 2D 39  4E F1 31 3E E8 B3 27 4B

Reply via email to