[tz] proposed changes for Win32 and a improved mktime() algorithm
Ian Abbott
abbotti at mev.co.uk
Thu May 18 18:22:12 UTC 2017
On 18/05/17 18:08, Zefram wrote:
> Paul Eggert wrote:
>> Thanks, I didn't know about this extension. However, it has undefined
>> behavior in standard C, so we can't use it in code intended to be portable
>> everywhere.
>
> I wondered about that, because it seems like the kind of thing that
> would have undefined behaviour, but I looked at the C standard, and on
> my reading it actually doesn't. The relevant wording is
>
> # An object whose identifier is declared with no linkage and without the
> # storage-class specifier "static" has /automatic storage duration/.
> # [...] storage is guaranteed to be reserved for a new instance of
> # the object on each entry into the block with which it is associated;
> # the initial value of the object is indeterminate.
>
> To have an indeterminate value does not amount to undefined behaviour.
> When we have no initialising clause at all, clearly the indeterminate
> value is not a problem if we don't rely on the value; that is how the code
> is currently correct. An "x = x" initialiser amounts to an assignment
> using that initial indeterminate value. Crucially, there's nothing saying
> that using an indeterminate value per se invokes undefined behaviour.
> My reading is that an indeterminate value is some actual value, though
> we don't know which value it is, and that copying it by assignment
> or initialisation just copies whatever value it is without trouble.
> Thus "x = x" is truly a no-op.
>
> So I think we'd be fine to adopt the "x = x" idiom without any
> conditionality. Of course, the idiom might elicit *more* warnings
> from compilers other than gcc, and that could be a reason to use it
> conditionally even if correctness isn't on the line. One also might
> want to hide it behind a macro even if used unconditionally, on the
> grounds that the macro name makes clearer what's going on.
I'm not sure about that. Although it is not normative, Section "J.2
Undefined behavior" includes:
# - The value of an object with automatic storage duration is
# used while it is indeterminate (6.2.4, 6.7.9, 6.8).
--
-=( Ian Abbott @ MEV Ltd. E-mail: <abbotti at mev.co.uk> )=-
-=( Web: http://www.mev.co.uk/ )=-
More information about the tz
mailing list