
Hello! With my hat of the tzdata/tzcode maintainer on the FreeBSD system, I sometimes get the more interesting bugs reported. For example this piece of code, on 64 bit machines it returns the same values for values bigger than the initial one: #include <errno.h> #include <stdint.h> #include <stdio.h> #include <time.h> void t_inspect(time_t t) { struct tm *tp; errno = 0; tp = gmtime(&t); printf("t: %ld, tp: %p errno: %d\n", t, tp, errno); if (tp) printf("sec: %d, min: %d, hour: %d, mday: %d, mon: %d, " "year: %d, wday: %d, yday: %d, isdst: %d, gmtoff: %ld, " "zone: %s\n", tp->tm_sec, tp->tm_min, tp->tm_hour, tp->tm_mday, tp->tm_mon, tp->tm_year, tp->tm_wday, tp->tm_yday, tp->tm_isdst, tp->tm_gmtoff, tp->tm_zone); } int main(void) { // time_t t = INT32_MAX; time_t t = 67767976233532799; t_inspect(t-1); t_inspect(t); t_inspect(t+1); t_inspect(t+2); return 0; } The output on a 64 bit machine is (the interesting part is the sec=59) t: 67767976233532798, tp: 0x80085b9a0 errno: 2 sec: 58, min: 59, hour: 23, mday: 31, mon: 11, year: 2147481747, wday: 2, yday: 364, isdst: 0, gmtoff: 0, zone: UTC t: 67767976233532799, tp: 0x80085b9a0 errno: 0 sec: 59, min: 59, hour: 23, mday: 31, mon: 11, year: 2147481747, wday: 2, yday: 364, isdst: 0, gmtoff: 0, zone: UTC t: 67767976233532800, tp: 0x80085b9a0 errno: 0 sec: 59, min: 59, hour: 23, mday: 31, mon: 11, year: 2147481747, wday: 2, yday: 364, isdst: 0, gmtoff: 0, zone: UTC t: 67767976233532801, tp: 0x80085b9a0 errno: 0 sec: 59, min: 59, hour: 23, mday: 31, mon: 11, year: 2147481747, wday: 2, yday: 364, isdst: 0, gmtoff: 0, zone: UTC Right now, I am looking for confirmation from people on the list if this behaviour is also happening on other 64 bit operating systems or that it is a FreeBSD specific quirk. Edwin