public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* -Warray-bounds interprets int *var as int var[0] ?
@ 2022-11-23 17:13 Georg-Johann Lay
  2022-11-23 17:18 ` Andrew Pinski
  0 siblings, 1 reply; 3+ messages in thread
From: Georg-Johann Lay @ 2022-11-23 17:13 UTC (permalink / raw)
  To: gcc

The following code throws a warning which I do not understand.

Purpose is to save and restore SREG, which is a special function 
register (SFR) defined by its hardware address as:

#define SREG (*(volatile uint8_t*) (0x3F + __AVR_SFR_OFFSET__))

which is the common C idiom to define such an SFR. The C code is:

<code>
typedef __UINT8_TYPE__ uint8_t;

#define SREG (*(volatile uint8_t*) (0x3F + __AVR_SFR_OFFSET__))

static __inline__ uint8_t __iCliRetVal (void)
{
     __asm__ __volatile__ ("cli" ::: "memory");
     return 1;
}

static __inline__ void __iRestore (const uint8_t *__s)
{
     SREG = *__s;
     __asm__ volatile ("" ::: "memory");
}

void foo (void)
{

    for (uint8_t sreg_save __attribute__((__cleanup__(__iRestore))) = SREG,
             __ToDo = __iCliRetVal();
          __ToDo ;
          __ToDo = 0 )
    {
        __asm ("nop");
    }
}
</code>

The documentation of attribute cleanup says that the function provided 
to cleanup (__iRestore) must take a pointer type that is compatible with 
the attributed variable, which is the case.  The warning is:

  avr-gcc-13 -c foo-i.c -mmcu=atmega8 -Os -Wall -save-temps -dumpbase ""
foo-i.c: In function 'foo':
foo-i.c:20:71: warning: array subscript 0 is outside array bounds of 
'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds]
    20 |    for (uint8_t sreg_save 
__attribute__((__cleanup__(__iRestore))) = SREG,
       | 
      ~^~~~
In function '__iRestore',
     inlined from 'foo' at foo-i.c:20:17:
foo-i.c:13:42: warning: array subscript 0 is outside array bounds of 
'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds]
    13 |     SREG = *__s;
       |     ~~~~~~~~~~~~                         ^

To me this looks like a GCC problem, and older versions of the compiler 
don't complain.  Or is there actually an issue with that code? Purpose 
of the code is to save / restore SREG around a block of code, "nop" in 
the example.

The warning complains about the places that are using SREG, so it that 
macro definition wrong?

Thanks in advance,

Johann


 > avr-gcc-13 -v
Using built-in specs.
Reading specs from 
/home/DATA/gnu/install/gcc-master-avr/bin/../lib/gcc/avr/13.0.0/device-specs/specs-avr2
COLLECT_GCC=avr-gcc-13
COLLECT_LTO_WRAPPER=/home/DATA/gnu/install/gcc-master-avr/bin/../libexec/gcc/avr/13.0.0/lto-wrapper
Target: avr
Configured with: ../../source/gcc-master/configure --target=avr 
--disable-nls --with-dwarf2 --enable-languages=c,c++ --with-gnu-as 
--with-gnu-ld --disable-shared --with-fixed-point=no 
--prefix=/home/john/gnu/install/gcc-master-avr --enable-checking=release
Thread model: single
Supported LTO compression algorithms: zlib
gcc version 13.0.0 20221103 (experimental) (GCC)


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: -Warray-bounds interprets int *var as int var[0] ?
  2022-11-23 17:13 -Warray-bounds interprets int *var as int var[0] ? Georg-Johann Lay
@ 2022-11-23 17:18 ` Andrew Pinski
  2022-11-23 17:44   ` Georg-Johann Lay
  0 siblings, 1 reply; 3+ messages in thread
From: Andrew Pinski @ 2022-11-23 17:18 UTC (permalink / raw)
  To: Georg-Johann Lay; +Cc: gcc

On Wed, Nov 23, 2022 at 9:15 AM Georg-Johann Lay <avr@gjlay.de> wrote:
>
> The following code throws a warning which I do not understand.
>
> Purpose is to save and restore SREG, which is a special function
> register (SFR) defined by its hardware address as:
>
> #define SREG (*(volatile uint8_t*) (0x3F + __AVR_SFR_OFFSET__))
>
> which is the common C idiom to define such an SFR. The C code is:
>
> <code>
> typedef __UINT8_TYPE__ uint8_t;
>
> #define SREG (*(volatile uint8_t*) (0x3F + __AVR_SFR_OFFSET__))
>
> static __inline__ uint8_t __iCliRetVal (void)
> {
>      __asm__ __volatile__ ("cli" ::: "memory");
>      return 1;
> }
>
> static __inline__ void __iRestore (const uint8_t *__s)
> {
>      SREG = *__s;
>      __asm__ volatile ("" ::: "memory");
> }
>
> void foo (void)
> {
>
>     for (uint8_t sreg_save __attribute__((__cleanup__(__iRestore))) = SREG,
>              __ToDo = __iCliRetVal();
>           __ToDo ;
>           __ToDo = 0 )
>     {
>         __asm ("nop");
>     }
> }
> </code>
>
> The documentation of attribute cleanup says that the function provided
> to cleanup (__iRestore) must take a pointer type that is compatible with
> the attributed variable, which is the case.  The warning is:
>
>   avr-gcc-13 -c foo-i.c -mmcu=atmega8 -Os -Wall -save-temps -dumpbase ""
> foo-i.c: In function 'foo':
> foo-i.c:20:71: warning: array subscript 0 is outside array bounds of
> 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds]
>     20 |    for (uint8_t sreg_save
> __attribute__((__cleanup__(__iRestore))) = SREG,
>        |
>       ~^~~~
> In function '__iRestore',
>      inlined from 'foo' at foo-i.c:20:17:
> foo-i.c:13:42: warning: array subscript 0 is outside array bounds of
> 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds]
>     13 |     SREG = *__s;
>        |     ~~~~~~~~~~~~                         ^
>
> To me this looks like a GCC problem, and older versions of the compiler
> don't complain.  Or is there actually an issue with that code? Purpose
> of the code is to save / restore SREG around a block of code, "nop" in
> the example.
>
> The warning complains about the places that are using SREG, so it that
> macro definition wrong?

Either you need to use --param=min-pagesize=0 as an option or you need
to modify the avr backend to set that by default.

Thanks,
Andrew Pinski

>
> Thanks in advance,
>
> Johann
>
>
>  > avr-gcc-13 -v
> Using built-in specs.
> Reading specs from
> /home/DATA/gnu/install/gcc-master-avr/bin/../lib/gcc/avr/13.0.0/device-specs/specs-avr2
> COLLECT_GCC=avr-gcc-13
> COLLECT_LTO_WRAPPER=/home/DATA/gnu/install/gcc-master-avr/bin/../libexec/gcc/avr/13.0.0/lto-wrapper
> Target: avr
> Configured with: ../../source/gcc-master/configure --target=avr
> --disable-nls --with-dwarf2 --enable-languages=c,c++ --with-gnu-as
> --with-gnu-ld --disable-shared --with-fixed-point=no
> --prefix=/home/john/gnu/install/gcc-master-avr --enable-checking=release
> Thread model: single
> Supported LTO compression algorithms: zlib
> gcc version 13.0.0 20221103 (experimental) (GCC)
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: -Warray-bounds interprets int *var as int var[0] ?
  2022-11-23 17:18 ` Andrew Pinski
@ 2022-11-23 17:44   ` Georg-Johann Lay
  0 siblings, 0 replies; 3+ messages in thread
From: Georg-Johann Lay @ 2022-11-23 17:44 UTC (permalink / raw)
  To: Andrew Pinski; +Cc: gcc



Am 23.11.22 um 18:18 schrieb Andrew Pinski:
> On Wed, Nov 23, 2022 at 9:15 AM Georg-Johann Lay <arv@jglay.de> wrote:
>>
>> The following code throws a warning which I do not understand.
>>
>> Purpose is to save and restore SREG, which is a special function
>> register (SFR) defined by its hardware address as:
>>
>> #define SREG (*(volatile uint8_t*) (0x3F + __AVR_SFR_OFFSET__))
>>
>> which is the common C idiom to define such an SFR. The C code is:
>>
>> <code>
>> typedef __UINT8_TYPE__ uint8_t;
>>
>> #define SREG (*(volatile uint8_t*) (0x3F + __AVR_SFR_OFFSET__))
>>
>> static __inline__ uint8_t __iCliRetVal (void)
>> {
>>       __asm__ __volatile__ ("cli" ::: "memory");
>>       return 1;
>> }
>>
>> static __inline__ void __iRestore (const uint8_t *__s)
>> {
>>       SREG = *__s;
>>       __asm__ volatile ("" ::: "memory");
>> }
>>
>> void foo (void)
>> {
>>
>>      for (uint8_t sreg_save __attribute__((__cleanup__(__iRestore))) = SREG,
>>               __ToDo = __iCliRetVal();
>>            __ToDo ;
>>            __ToDo = 0 )
>>      {
>>          __asm ("nop");
>>      }
>> }
>> </code>
>>
>> The documentation of attribute cleanup says that the function provided
>> to cleanup (__iRestore) must take a pointer type that is compatible with
>> the attributed variable, which is the case.  The warning is:
>>
>>    avr-gcc-13 -c foo-i.c -mmcu=atmega8 -Os -Wall -save-temps -dumpbase ""
>> foo-i.c: In function 'foo':
>> foo-i.c:20:71: warning: array subscript 0 is outside array bounds of
>> 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds]
>>      20 |    for (uint8_t sreg_save
>> __attribute__((__cleanup__(__iRestore))) = SREG,
>>         |
>>        ~^~~~
>> In function '__iRestore',
>>       inlined from 'foo' at foo-i.c:20:17:
>> foo-i.c:13:42: warning: array subscript 0 is outside array bounds of
>> 'volatile uint8_t[0]' {aka 'volatile unsigned char[]'} [-Warray-bounds]
>>      13 |     SREG = *__s;
>>         |     ~~~~~~~~~~~~                         ^
>>
>> To me this looks like a GCC problem, and older versions of the compiler
>> don't complain.  Or is there actually an issue with that code? Purpose
>> of the code is to save / restore SREG around a block of code, "nop" in
>> the example.
>>
>> The warning complains about the places that are using SREG, so it that
>> macro definition wrong?
> 
> Either you need to use --param=min-pagesize=0 as an option or you need
> to modify the avr backend to set that by default.
> 
> Thanks,
> Andrew Pinski

Ok, thanks. I filed it as PR107842.

Johann

>>   > avr-gcc-13 -v
>> Using built-in specs.
>> Reading specs from
>> /home/DATA/gnu/install/gcc-master-avr/bin/../lib/gcc/avr/13.0.0/device-specs/specs-avr2
>> COLLECT_GCC=avr-gcc-13
>> COLLECT_LTO_WRAPPER=/home/DATA/gnu/install/gcc-master-avr/bin/../libexec/gcc/avr/13.0.0/lto-wrapper
>> Target: avr
>> Configured with: ../../source/gcc-master/configure --target=avr
>> --disable-nls --with-dwarf2 --enable-languages=c,c++ --with-gnu-as
>> --with-gnu-ld --disable-shared --with-fixed-point=no
>> --prefix=/home/john/gnu/install/gcc-master-avr --enable-checking=release
>> Thread model: single
>> Supported LTO compression algorithms: zlib
>> gcc version 13.0.0 20221103 (experimental) (GCC)

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-11-23 17:44 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-23 17:13 -Warray-bounds interprets int *var as int var[0] ? Georg-Johann Lay
2022-11-23 17:18 ` Andrew Pinski
2022-11-23 17:44   ` Georg-Johann Lay

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).