On Wed, 07 Aug 2013, Clive D.W. Feather wrote:
Alois Treindl said:
In localtime.c, function localsub() are these three lines of code:
1295 icycles = tcycles; 1296 if (tcycles - icycles >= 1 || icycles - tcycles >= 1) 1297 return NULL;
I do not understand the reason why lines 1296 and 1297 exist. icycles and tcycles are equal.
[tcycles has type time_t, which might not be an integer type] [icycles has type int_fast64_t]
That code checks whether the value in tcycles is within the range of int_fast64_t. If it is, the conversion on line 1295 will either produce the same number or (if time_t is floating point) will round it off to the nearest integer. In that case, both halves of the test will be false.
But if the value in tcycles is out of range, the conversion will generate a completely different number, and so one of those tests will be true.
If the value is out of range, then the assignment (icycles = tcycles) invokes undefined behaviour, so the test in the if statement might not do what one would expect. If the tz code wants to check that a variable is in range, I think it should do without performing a possibly-undefined operation. --apb (Alan Barrett)