[rtems commit] Use uint32_t instead of long. Use unsigned defines ( Prevent overflows on 16bit targets)
Joel Sherrill
joel.sherrill at OARcorp.com
Wed Apr 17 17:46:15 UTC 2013
On 4/17/2013 10:15 AM, Ralf Corsepius wrote:
> On 04/17/2013 02:53 PM, Sebastian Huber wrote:
>> On 04/17/2013 12:19 PM, Ralf Corsepius wrote:
>> [...]
>>> @@ -147,8 +147,8 @@ static uint32_t simple_random(uint32_t v)
>>>
>>> static unsigned get_bucket_with_random(unsigned count, long random)
>>> {
>>> - long unsigned unit = (1U << 31) / count;
>>> - long unsigned bucket = (long unsigned) random / unit;
>>> + uint32_t unit = ((uint32_t) 1U << 31) / count;
>>> + uint32_t bucket = (uint32_t) random / unit;
>>>
>>> if (bucket != count) {
>>> return bucket;
>> A long must be able to store a 32-bit integer so there is no need to use
>> uint32_t here.
> Such is theory - Realty is different.
>
> The assumptions of long >= 32 bit only applies to POSIX conformant targets.
According to Wikipedia, C99 requires long to be >= 32 bits
(http://en.wikipedia.org/wiki/C_data_types
<http://en.wikipedia.org/wiki/C_data_types>) which matches
the definition of LONG_MIN/LONG_MAX in limits.h per this
admittedly draft from 2005 TC3 version of the standard
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
It appears this is the last draft before final vote.
> RTEMS however supports targets, which are not strictly POSIX compliant,
> where longs are 16bit => The code above fails to compile the code above
> when using longs.
I tried the h8300 multilibs and got sizeof(long)==4. I recall cases
where there
were warnings when int overflowed when << by more than 16 bits. But that's
reasonable. int can be 16 bits and we have third party code that primarily
supports 32-bit environments. That leaves this question:
Which target and multilib has long < 32-bits?
I can only think of one case -- avr when -mint8 is specified and the gcc
manual
says this:
`-mint8'
Assume int to be 8 bit integer. This affects the sizes of all
types: A char will be 1 byte, an int will be 1 byte, an long will
be 2 bytes and long long will be 4 bytes. Please note that this
option does not comply to the C standards, but it will provide you
with smaller code size.
I thought we assumed C99 and although I can't find the C89 standard
to check if this changed. The gcc manual doesn't mention anything on this.
If we have a specific case in mind, it needs to be commented on by GCC C
language
lawyers. It looks to be a violation of the standard to me.
If int8 on the avr is the issue, then I think that multilib needs to be
excluded
because we assume standard C.
>
> Ralf
>
>
>
>
> _______________________________________________
> rtems-devel mailing list
> rtems-devel at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-devel
--
Joel Sherrill, Ph.D. Director of Research & Development
joel.sherrill at OARcorp.com On-Line Applications Research
Ask me about RTEMS: a free RTOS Huntsville AL 35805
Support Available (256) 722-9985
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20130417/7703c718/attachment-0001.html>
More information about the devel
mailing list