Optimisations and undefined behaviour
Andrew Haley
aph@redhat.com
Mon Nov 9 15:22:00 GMT 2015
On 11/09/2015 03:05 PM, Richard Earnshaw wrote:
> On 09/11/15 15:00, Andrew Haley wrote:
>> On 11/09/2015 02:56 PM, Richard Earnshaw wrote:
>>> On 09/11/15 14:29, Andrew Haley wrote:
>>
>>>> Here it is again:
>>>>
>>>> int foo(int x) {
>>>> if (x > 1290) {
>>>> printf("X is wrong here %d, but we don't care\n", x);
>>>> }
>>>> return x*x*x;
>>>>
>>>> Here, the printf writes to a stream then the UB happens.
>>>
>>> Not if setvbuf has been used to make the stream unbuffered.
>>
>> It hasn't. And I know it hasn't because it's my example.
>
> A compiler would still need to do whole-program analysis to prove that;
> it can't work on the assumption that it hasn't been done.
I'm not sure about that: see below.
>> And besides, the UB might cause the computer to crash before the
>> data has been written to stdout by the kernel; the same reasoning
>> applies.
>
> UB that causes the machine to crash is, I think, outside of what we need
> to think about. Any machine that's falls over in that case is not
> interesting.
Well, in that case you'll have to define what you think we are
supposed to be thinking about. I don't think you are talking about
the C language as it is specified, you're talking about some
implementation on some machine, and of course I can't argue with you
about what that machine does because I don't know anything about it.
Such a discussion is IMO pointless because everyone can just Make
Stuff Up.
I do know that once UB has happened in a program, the whole program is
undefined and the language specification imposes no requirements on it
at all. I don't see any language in the specification which requires
prior operations with side effects to have completed.
But should we treat all potential UB as having a side effect,
(essentially treating it like a volatile) so that it cannot be moved
past a sequence point? I wouldn't have thought so, but perhaps we
could.
Andrew.
More information about the Gcc-help
mailing list