Optimisations and undefined behaviour

David Brown david.brown@hesbynett.no
Mon Nov 9 13:13:00 GMT 2015


On 09/11/15 13:42, Vincent Lefevre wrote:
> On 2015-11-09 03:40:12 -0600, Segher Boessenkool wrote:
>> On Mon, Nov 09, 2015 at 09:28:49AM +0100, Vincent Lefevre wrote:
>>> On 2015-11-08 18:49:46 -0600, Segher Boessenkool wrote:
>>>> On Mon, Nov 09, 2015 at 01:27:34AM +0100, Vincent Lefevre wrote:
>>>>>> Why not simply:
>>>>>>   unsigned y = x;
>>>>>>   return y*y*y;
>>>>>> ? This is an example where defined behavior is so easy to get...
>>>>>
>>>>> But what if the result of y*y*y (an unsigned int) does not fit in
>>>>> an int?
>>>>
>>>> That is implementation-defined. not undefined (6.3.1.3); GCC documents
>>>> it like this:
>>>>
>>>>      For conversion to a type of width N, the value is reduced modulo
>>>>      2^N to be within range of the type; no signal is raised.
>>>
>>> That's what GCC does, but what if the user uses another compiler
>>> or GCC decides to change this behavior in the future?
>>
>> Then it is still not undefined behaviour.  It can give different results
>> of course.
> 
> ... including a signal, which is not acceptable for the OP, if I
> understand correctly ("we don't care about the result in such cases"
> doesn't imply that the program may terminate immediately).
> 

Correct.

The ideal here is to get an /unspecified/ integer - without the risk of
a trap or undefined behaviour.  Implementation-defined behaviour that is
known to be safe on gcc is a step forward - I am aware that the ideal
here is not possible in standard and portable C.

In this particular example, implementation-dependent behaviour is fine.
 But in some circumstances, unspecified behaviour /may/ be even better
as it gives the compiler complete freedom for optimisation.  Here the
compiler is required to generate a specific result, as calculated using
the implementation-specified rules.




More information about the Gcc-help mailing list