This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Implement -fsanitize=float-cast-overflow (take 3)
- From: Konstantin Serebryany <konstantin dot s dot serebryany at gmail dot com>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: Marek Polacek <polacek at redhat dot com>, GCC Patches <gcc-patches at gcc dot gnu dot org>, "Joseph S. Myers" <joseph at codesourcery dot com>
- Date: Fri, 23 May 2014 18:55:39 +0400
- Subject: Re: [PATCH] Implement -fsanitize=float-cast-overflow (take 3)
- Authentication-results: sourceware.org; auth=none
- References: <20140523141900 dot GD17600 at redhat dot com> <20140523142839 dot GU10386 at tucnak dot redhat dot com> <CAGQ9bdwVYjChP95AWtQ_6dAnTPQYLYUfn2Er+yQi2=vMqfxhfg at mail dot gmail dot com>
On Fri, May 23, 2014 at 6:35 PM, Konstantin Serebryany
<konstantin.s.serebryany@gmail.com> wrote:
> On Fri, May 23, 2014 at 6:28 PM, Jakub Jelinek <jakub@redhat.com> wrote:
>> On Fri, May 23, 2014 at 04:19:00PM +0200, Marek Polacek wrote:
>>> This is the latest patch for -fsanitize=float-cast-overflow. Since last
>>> version it:
>>> - adds tons of tests written by Jakub;
>>> - patches libubsan so it can handle 96-bit floating-point types
>>> (that is, long double and __float80 in -m32 mode);
>>
>> CCing Kostya on this one liner, which has been posted to llvm-commits,
>> but nothing has been done yet. I'm approving this anyway, I don't see
>> anything controversial on it and clang fails without that change the same
>> (supposedly insufficient test coverage on the compiler-rt side).
>
> ubsan is not my domain, but since the patch is so simple let me try to
> handle it.
http://llvm.org/viewvc/llvm-project?view=revision&revision=209516
>
>>
>>> - includes a hack for printing __float{80,128}/_Decimal* types in
>>> libubsan. Since libubsan handles only float/double/long double
>>> floating-point types, we use TK_Unknown for other types, meaning
>>> that libubsan prints "<unknown>" instead of the value.
>>
>> I think this is for now good, while in theory I can imagine not very long
>> code to print _Decimal* to string (convert to binary integer format if
>> in the densely packed format (hey, ppc*), print __int128 significand
>> (or do 2x wide long long division/modulo) into string using snprintf,
>> take care of exponent and sign and putting in decimal dot), it is not high
>> prio for me, and for __float128 you can hardly avoid libquadmath or
>> something similarly large, unless you want to print it as C99 hexadecimal
>> float (that would be again pretty easy).
>>
>>> Regtested/bootstrapped on x86_64-linux. Couldn't test ppc64, as
>>> libsanitizer currently doesn't build on this architecture.
>>>
>>> Ok for trunk?
>>>
>>> 2014-05-23 Marek Polacek <polacek@redhat.com>
>>> Jakub Jelinek <jakub@redhat.com>
>>>
>>> * builtins.def: Change SANITIZE_FLOAT_DIVIDE to SANITIZE_NONDEFAULT.
>>> * gcc.c (sanitize_spec_function): Likewise.
>>> * convert.c (convert_to_integer): Include "ubsan.h". Add
>>> floating-point to integer instrumentation.
>>> * doc/invoke.texi: Document -fsanitize=float-cast-overflow.
>>> * flag-types.h (enum sanitize_code): Add SANITIZE_FLOAT_CAST and
>>> SANITIZE_NONDEFAULT.
>>> * opts.c (common_handle_option): Handle -fsanitize=float-cast-overflow.
>>> * sanitizer.def (BUILT_IN_UBSAN_HANDLE_FLOAT_CAST_OVERFLOW,
>>> BUILT_IN_UBSAN_HANDLE_FLOAT_CAST_OVERFLOW_ABORT): Add.
>>> * ubsan.c: Include "realmpfr.h" and "dfp.h".
>>> (get_ubsan_type_info_for_type): Handle REAL_TYPEs.
>>> (ubsan_type_descriptor): Set tkind to 0xffff for types other than
>>> float/double/long double.
>>> (ubsan_instrument_float_cast): New function.
>>> * ubsan.h (ubsan_instrument_float_cast): Declare.
>>> testsuite/
>>> * c-c++-common/ubsan/float-cast-overflow-1.c: New test.
>>> * c-c++-common/ubsan/float-cast-overflow-10.c: New test.
>>> * c-c++-common/ubsan/float-cast-overflow-2.c: New test.
>>> * c-c++-common/ubsan/float-cast-overflow-3.c: New test.
>>> * c-c++-common/ubsan/float-cast-overflow-4.c: New test.
>>> * c-c++-common/ubsan/float-cast-overflow-5.c: New test.
>>> * c-c++-common/ubsan/float-cast-overflow-6.c: New test.
>>> * c-c++-common/ubsan/float-cast-overflow-7.c: New test.
>>> * c-c++-common/ubsan/float-cast-overflow-7.h: New file.
>>> * c-c++-common/ubsan/float-cast-overflow-8.c: New test.
>>> * c-c++-common/ubsan/float-cast-overflow-9.c: New test.
>>> * c-c++-common/ubsan/float-cast.h: New file.
>>> * g++.dg/ubsan/float-cast-overflow-bf.C: New test.
>>> * gcc.dg/ubsan/float-cast-overflow-bf.c: New test.
>>> libsanitizer/
>>> * ubsan/ubsan_value.cc (getFloatValue): Handle 96-bit
>>> floating-point types.
>>
>> Ok, thanks.
>>
>> Jakub