diff mbox

Robustify REAL_MODE_FORMAT

Message ID 87eggdu1z4.fsf@e105548-lin.cambridge.arm.com
State New
Headers show

Commit Message

Richard Sandiford Oct. 29, 2015, 3:30 p.m. UTC
Make sure that REAL_MODE_FORMAT aborts if it is passed an invalid mode,
rather than stepping beyond the bounds of an array.  It turned out that
some code was passing non-float modes to the real.h routines.

Tested on x86_64-linux-gnu, arm-linux-gnueabi and aarch64-linux-gnu.
OK to install?

Thanks,
Richard


gcc/
	* real.h (REAL_MODE_FORMAT): Abort if the mode isn't a
	SCALAR_FLOAT_MODE_P.

Comments

Bernd Schmidt Oct. 29, 2015, 3:33 p.m. UTC | #1
On 10/29/2015 04:30 PM, Richard Sandiford wrote:
> Make sure that REAL_MODE_FORMAT aborts if it is passed an invalid mode,
> rather than stepping beyond the bounds of an array.  It turned out that
> some code was passing non-float modes to the real.h routines.

> gcc/
> 	* real.h (REAL_MODE_FORMAT): Abort if the mode isn't a
> 	SCALAR_FLOAT_MODE_P.

I'm assuming that the code you mention has already been fixed so that we 
don't trigger the abort. Ok.


Bernd
Richard Biener Oct. 29, 2015, 4:25 p.m. UTC | #2
On October 29, 2015 4:33:17 PM GMT+01:00, Bernd Schmidt <bschmidt@redhat.com> wrote:
>On 10/29/2015 04:30 PM, Richard Sandiford wrote:
>> Make sure that REAL_MODE_FORMAT aborts if it is passed an invalid
>mode,
>> rather than stepping beyond the bounds of an array.  It turned out
>that
>> some code was passing non-float modes to the real.h routines.
>
>> gcc/
>> 	* real.h (REAL_MODE_FORMAT): Abort if the mode isn't a
>> 	SCALAR_FLOAT_MODE_P.
>
>I'm assuming that the code you mention has already been fixed so that
>we 
>don't trigger the abort. Ok.

Rather than the weird macro can't we turn real_mode_format to an inline function?

Richard.

>
>Bernd
Richard Sandiford Oct. 29, 2015, 4:32 p.m. UTC | #3
Richard Biener <richard.guenther@gmail.com> writes:
> On October 29, 2015 4:33:17 PM GMT+01:00, Bernd Schmidt
> <bschmidt@redhat.com> wrote:
>>On 10/29/2015 04:30 PM, Richard Sandiford wrote:
>>> Make sure that REAL_MODE_FORMAT aborts if it is passed an invalid
>>mode,
>>> rather than stepping beyond the bounds of an array.  It turned out
>>that
>>> some code was passing non-float modes to the real.h routines.
>>
>>> gcc/
>>> 	* real.h (REAL_MODE_FORMAT): Abort if the mode isn't a
>>> 	SCALAR_FLOAT_MODE_P.
>>
>>I'm assuming that the code you mention has already been fixed so that
>>we 
>>don't trigger the abort. Ok.
>
> Rather than the weird macro can't we turn real_mode_format to an inline
> function?

It needs to be an lvalue for things like:

	REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;

I suppose we could return a non-const reference, but I'd rather stay
clear of returning those :-)

Thanks,
Richard
Richard Biener Oct. 30, 2015, 8:59 a.m. UTC | #4
On Thu, Oct 29, 2015 at 5:32 PM, Richard Sandiford
<richard.sandiford@arm.com> wrote:
> Richard Biener <richard.guenther@gmail.com> writes:
>> On October 29, 2015 4:33:17 PM GMT+01:00, Bernd Schmidt
>> <bschmidt@redhat.com> wrote:
>>>On 10/29/2015 04:30 PM, Richard Sandiford wrote:
>>>> Make sure that REAL_MODE_FORMAT aborts if it is passed an invalid
>>>mode,
>>>> rather than stepping beyond the bounds of an array.  It turned out
>>>that
>>>> some code was passing non-float modes to the real.h routines.
>>>
>>>> gcc/
>>>>     * real.h (REAL_MODE_FORMAT): Abort if the mode isn't a
>>>>     SCALAR_FLOAT_MODE_P.
>>>
>>>I'm assuming that the code you mention has already been fixed so that
>>>we
>>>don't trigger the abort. Ok.
>>
>> Rather than the weird macro can't we turn real_mode_format to an inline
>> function?
>
> It needs to be an lvalue for things like:
>
>         REAL_MODE_FORMAT (TFmode) = &ibm_extended_format;
>
> I suppose we could return a non-const reference, but I'd rather stay
> clear of returning those :-)

Yes please.  But SET_REAL_MODE_FORMAT (TFmode, &ibm_extended_format)
would work as well.

Richard.

> Thanks,
> Richard
>
diff mbox

Patch

diff --git a/gcc/real.h b/gcc/real.h
index e65b526..d3b14e5 100644
--- a/gcc/real.h
+++ b/gcc/real.h
@@ -167,7 +167,9 @@  extern const struct real_format *
   (real_format_for_mode[DECIMAL_FLOAT_MODE_P (MODE)			\
 			? (((MODE) - MIN_MODE_DECIMAL_FLOAT)		\
 			   + (MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1))	\
-			: ((MODE) - MIN_MODE_FLOAT)])
+			: GET_MODE_CLASS (MODE) == MODE_FLOAT		\
+			? ((MODE) - MIN_MODE_FLOAT)			\
+			: (gcc_unreachable (), 0)])
 
 #define FLOAT_MODE_FORMAT(MODE) \
   (REAL_MODE_FORMAT (SCALAR_FLOAT_MODE_P (MODE)? (MODE) \