[tz] source code question regarding localtime.c PS
apb at cequrux.com
Wed Aug 7 15:38:54 UTC 2013
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)
More information about the tz