[llvm-dev] double to unsigned char cast

Jay K via llvm-dev llvm-dev at lists.llvm.org
Fri May 25 10:09:20 PDT 2018


I acknowledge that the type system is full of holes ("C++ is not safe") and the standard gives you leeway, but I've never before witnessed a cast to an integer type not yielding some value in range for that integer type. And even clang does provide such here, on x86 and amd64.


I have to also read our spec to see what we are supposed to return here also.

The "workaround" of casting to int first doesn't seem any better defined than casting directly to char, given a double that doesn't fit in int either.


 - Jay

________________________________
From: James Y Knight <jyknight at google.com>
Sent: Friday, May 25, 2018 1:39 PM
To: Hans Wennborg
Cc: jayk123 at hotmail.com; llvm-dev; lewurm at gmail.com
Subject: Re: [llvm-dev] double to unsigned char cast

I'd also note that -fsanitize=undefined will detect the error at runtime.

On Fri, May 25, 2018 at 4:38 AM Hans Wennborg via llvm-dev <llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>> wrote:
On Tue, May 22, 2018 at 6:17 PM, Jay K via llvm-dev
<llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>> wrote:
> This seems disappointing.
>
> Casting any value to an integral type should yield a value within the range
> of that integral type.

As Tim pointed out, that's not what the standard says though.

Trunk Clang (I'm not sure what version your Xcode Clang is based on)
has a flag to disable this optimization:
-fno-strict-float-cast-overflow

 - Hans


> The value can be anything, but it should be within range.
>
> i.e. it should be as if I anded it with (type)~(type)0.
>
>
> i.e. int i = (signed char)x;
>
> assert(i >= -128 && i <= 127);
>
>
> int i = (unsigned char)x;
>
> assert(i >= 0 && i <= 255);
>
>
> seem very reasonable, assuming there is no "trap"  before the assert.
>
>  - Jay
>
>
>
> ________________________________
> From: Tim Northover <t.p.northover at gmail.com<mailto:t.p.northover at gmail.com>>
> Sent: Thursday, April 5, 2018 4:41 PM
> To: Jay K
> Cc: llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>; lewurm at gmail.com<mailto:lewurm at gmail.com>
> Subject: Re: [llvm-dev] double to unsigned char cast
>
> Hi Jay,
>
> On 5 April 2018 at 07:49, Jay K via llvm-dev <llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>>
> wrote:
>> wrt
>>
>> https://github.com/mono/mono/commit/fb91fce5d339bb9ffe507588f5bc1d8d6f244d9b
>
>>
>>
>> This doesn't seem right to me.
>
> Nevertheless, it's what the standard says. C99 6.3.1.4<http://6.3.1.4>: When a finite
> value of real floating type is converted to an integer type other than
> _Bool, the fractional part is discarded (i.e. the value is truncated
> toward zero). If the value of the integral part cannot be represented
> by the integer type, the behavior is undefined.
>
> By definition any double you're allowed to convert to an unsigned char
> doesn't need the "and".
>
> Cheers.
>
> Tim.
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
_______________________________________________
LLVM Developers mailing list
llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180525/99c14926/attachment.html>


More information about the llvm-dev mailing list