[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 2/2] util/cutils: Fix incorrect integer->float conversion
From: |
Juan Quintela |
Subject: |
Re: [PATCH v3 2/2] util/cutils: Fix incorrect integer->float conversion caught by clang |
Date: |
Fri, 22 Nov 2019 09:55:42 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/26.2 (gnu/linux) |
Markus Armbruster <address@hidden> wrote:
> From: Fangrui Song <address@hidden>
>
> Clang does not like do_strtosz()'s code to guard against overflow:
>
> qemu/util/cutils.c:245:23: error: implicit conversion from 'unsigned
> long' to 'double' changes value from 18446744073709550592 to
> 18446744073709551616 [-Werror,-Wimplicit-int-float-conversion]
>
> The warning will be enabled by default in clang 10. It is not
> available for clang <= 9.
>
> val * mul >= 0xfffffffffffffc00 is indeed wrong. 0xfffffffffffffc00
> is not representable exactly as double. It's half-way between the
> representable values 0xfffffffffffff800 and 0x10000000000000000.
> Which one we get is implementation-defined. Bad.
>
> We want val * mul > (the largest uint64_t exactly representable as
> double). That's 0xfffffffffffff800. Write it as nextafter(0x1p64, 0)
> with a suitable comment.
>
> Signed-off-by: Fangrui Song <address@hidden>
> Reviewed-by: Markus Armbruster <address@hidden>
> [Patch split, commit message improved]
> Signed-off-by: Markus Armbruster <address@hidden>
Reviewed-by: Juan Quintela <address@hidden>
Learning this *new* C99 float format O:-)