[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gcc
Subject:    Re: why GCC does implicit promotion to unsigned char?
From:       David Brown <david () westcontrol ! com>
Date:       2012-01-27 9:56:54
Message-ID: 4F2274E6.6070600 () westcontrol ! com
[Download RAW message or body]

On 27/01/2012 10:56, Richard Guenther wrote:
> On Fri, Jan 27, 2012 at 10:40 AM, David Brown<david@westcontrol.com>  wrote:
>> On 27/01/2012 10:02, Richard Guenther wrote:
>>>
>>> On Thu, Jan 26, 2012 at 4:58 PM, David Brown<david@westcontrol.com>
>>>   wrote:
>>>>
>>>> On 26/01/2012 12:53, Konstantin Vladimirov wrote:
>>>>>
>>>>>
>>>>> Hi,
>>>>>
>>>>> If I know what I am doing, and my code itself guarantees, that there
>>>>> will be no overflows and UB here, can I switch off this signed char to
>>>>> unsigned char expansion in favor of signed char to signed int
>>>>> expansion?
>>>>>
>>>>
>>>> The big question here is why you are using an unqualified "char" for
>>>> arithmetic in the first place.  The signedness of plain "char" varies by
>>>> target (some default to signed, some to unsigned) and by compiler flags.
>>>>   If
>>>> you want to write code that uses signed chars, use "signed char". Or even
>>>> better, use<stdint.h>    type "int8_t".
>>>>
>>>> However, as has been pointed out, the problem is that signed arithmetic
>>>> doesn't wrap - it must be turned into unsigned arithmetic to make it
>>>> safe.
>>>>   An alternative is to tell gcc that signed arithmetic is 2's compliment
>>>> and
>>>> wraps, by using the "-fwrapv" flag or "int8_t char sum_A_B(void)
>>>> __attribute__((optimize("wrapv")));" on the specific function.
>>>
>>>
>>> Note that semantic changing optimize attributes do not work reliably.
>>>
>>> Richard.
>>>
>>
>> Is there any more information about that somewhere?  Certainly I expect
>> there to be issues when trying to turn on and off options like
>> "-fshort-enums" or "-freg-struct-return" - just as you can expect problems
>> linking modules that have been compiled with different flags like that.  But
>> others like "-fwrapv", "-fargument-alias", or "-finstrument-functions" can
>> logically be applied to a single function.  If there are problems with
>> changing these (with attributes or pragmas), then perhaps they should be
>> disabled, or the potential problems documented in the manual?
>
> Well, the implementation is simply a bit naiive in accepting all options
> and not all code is prepared to handle functions which differ in optimization
> options.  For example inlining happily will inline a -fwrapv function into
> a -fno-wrapv function and later assume the inlined copy does have -fno-wrapv
> semantics.  The safe implementation here would have been to disallow
> any inlining between functions that have any optimize attribute/pragma,
> but that of course would defeat most of its use.
>
> That said, using the attribute for debugging might be of help, but I would
> not rely on it in any way.
>
> Richard.
>

That makes a lot of sense - thanks for the explanation.  I had naively 
been thinking that it should be safe to change "-fwrapv" for a function 
- but inlining parts of other functions with different "-fwrapv" 
settings would make things a lot more complicated.

Using a pragma to set -fwrapv at the start of a C file (before any 
#include's that contained inline functions) would presumably be safe, 
acting just the command line switch.

On the other hand, LTO might cause trouble there too...

For my own use, I would always put a flag like that in the makefile, and 
almost always apply it globally to all files in the program - but not 
everyone works like that, and it's nice to know the possibilities and 
limitations.

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic