public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug tree-optimization/104657] New: array subscript 0 is outside array bounds
@ 2022-02-23 10:18 christophm30 at gmail dot com
  2022-02-23 10:36 ` [Bug tree-optimization/104657] " pinskia at gcc dot gnu.org
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: christophm30 at gmail dot com @ 2022-02-23 10:18 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104657

            Bug ID: 104657
           Summary: array subscript 0 is outside array bounds
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: christophm30 at gmail dot com
  Target Milestone: ---

Compiling the following code:

void foo(unsigned long v)
{
        volatile unsigned long *p;
        p = (void *)0x8;
        *p = v;
}

with GCC master and "-O2 -Wall" results in the following warning:

$ gcc -O2 -Wall  -c array_subscript_0.c 
array_subscript_0.c: In function 'foo':
array_subscript_0.c:5:9: warning: array subscript 0 is outside array bounds of
'volatile long unsigned int[0]' [-Warray-bounds]
    5 |         *p = v;
      |         ^~

This warning is unexpected and is not triggered by earlier versions of GCC.

Possibly related: pr101977

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

* [Bug tree-optimization/104657] array subscript 0 is outside array bounds
  2022-02-23 10:18 [Bug tree-optimization/104657] New: array subscript 0 is outside array bounds christophm30 at gmail dot com
@ 2022-02-23 10:36 ` pinskia at gcc dot gnu.org
  2022-02-23 11:14 ` christophm30 at gmail dot com
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-02-23 10:36 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104657

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|---                         |DUPLICATE

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Dup of bug 99578.

*** This bug has been marked as a duplicate of bug 99578 ***

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

* [Bug tree-optimization/104657] array subscript 0 is outside array bounds
  2022-02-23 10:18 [Bug tree-optimization/104657] New: array subscript 0 is outside array bounds christophm30 at gmail dot com
  2022-02-23 10:36 ` [Bug tree-optimization/104657] " pinskia at gcc dot gnu.org
@ 2022-02-23 11:14 ` christophm30 at gmail dot com
  2022-02-23 18:16 ` msebor at gcc dot gnu.org
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: christophm30 at gmail dot com @ 2022-02-23 11:14 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104657

--- Comment #2 from Christoph Müllner <christophm30 at gmail dot com> ---
Thanks for referencing pr99578.
Based on the information there, I created the following workaround:

void foo(unsigned long v)
{
        volatile unsigned long *p;
        p = (volatile unsigned long*)8;
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Warray-bounds"
        *p = v;
#pragma GCC diagnostic pop
}

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

* [Bug tree-optimization/104657] array subscript 0 is outside array bounds
  2022-02-23 10:18 [Bug tree-optimization/104657] New: array subscript 0 is outside array bounds christophm30 at gmail dot com
  2022-02-23 10:36 ` [Bug tree-optimization/104657] " pinskia at gcc dot gnu.org
  2022-02-23 11:14 ` christophm30 at gmail dot com
@ 2022-02-23 18:16 ` msebor at gcc dot gnu.org
  2022-02-23 22:17 ` christophm30 at gmail dot com
  2022-02-23 22:35 ` christophm30 at gmail dot com
  4 siblings, 0 replies; 6+ messages in thread
From: msebor at gcc dot gnu.org @ 2022-02-23 18:16 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104657

Martin Sebor <msebor at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |msebor at gcc dot gnu.org

--- Comment #3 from Martin Sebor <msebor at gcc dot gnu.org> ---
An alternate way of avoiding the warning in cases when the code is safe is to
make the pointer itself volatile, e.g., as below.  The codegen impact should be
negligible (an extra instruction on x86_.

static volatile unsigned long * const volatile p0x8 = (void*)8;

void bar(unsigned long v)
{
    *p0x8 = v;
}

As I mentioned in bug  99578 comment 25, on the AVR target GCC supports
attribute address which can be used to pin a declared object to a hardwired
address like so:

void bar(unsigned long v)
{
    extern volatile unsigned long x0x8 __attribute__ ((address (0x8)));

    x0x8 = v;
}

This avoids the warning and emits object code that's equivalent to the
original.

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

* [Bug tree-optimization/104657] array subscript 0 is outside array bounds
  2022-02-23 10:18 [Bug tree-optimization/104657] New: array subscript 0 is outside array bounds christophm30 at gmail dot com
                   ` (2 preceding siblings ...)
  2022-02-23 18:16 ` msebor at gcc dot gnu.org
@ 2022-02-23 22:17 ` christophm30 at gmail dot com
  2022-02-23 22:35 ` christophm30 at gmail dot com
  4 siblings, 0 replies; 6+ messages in thread
From: christophm30 at gmail dot com @ 2022-02-23 22:17 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104657

--- Comment #4 from Christoph Müllner <christophm30 at gmail dot com> ---
Thanks for mentioning the volatile pointer method.
However, the pragma-solution results in better code (fewer instructions and
does not require a valid stack pointer).

I've used the code below to see what happens on AArch64 and RISC-V 64-bit:
#define MEM_ADDR 0xffff8000
void foo_warning(unsigned long v)
{
        volatile unsigned long * p;
        p = (void*)MEM_ADDR;
        *p = v;
}

void foo_warningfree(unsigned long v)
{
        volatile unsigned long * p;
        p = (void*)MEM_ADDR;
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Warray-bounds"
        *p = v;
#pragma GCC diagnostic pop
}

void foo_volatile(unsigned long v)
{
        volatile unsigned long * volatile p;
        p = (void*)MEM_ADDR;
        *p = v;
}

AArch64:
foo_warning:
        mov     x1, 4294934528
        str     x0, [x1]
        ret
foo_warningfree:
        mov     x1, 4294934528
        str     x0, [x1]
        ret
foo_volatile:
        sub     sp, sp, #16
        mov     x1, 4294934528
        str     x1, [sp, 8]
        ldr     x1, [sp, 8]
        str     x0, [x1]
        add     sp, sp, 16
        ret

RISC-V 64-bit:
foo_warning:
        li      a5,536866816
        slli    a5,a5,3
        sd      a0,0(a5)
        ret
foo_warningfree:
        li      a5,536866816
        slli    a5,a5,3
        sd      a0,0(a5)
        ret
foo_volatile:
        li      a5,536866816
        addi    sp,sp,-16
        slli    a5,a5,3
        sd      a5,8(sp)
        ld      a5,8(sp)
        sd      a0,0(a5)
        addi    sp,sp,16
        jr      ra

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

* [Bug tree-optimization/104657] array subscript 0 is outside array bounds
  2022-02-23 10:18 [Bug tree-optimization/104657] New: array subscript 0 is outside array bounds christophm30 at gmail dot com
                   ` (3 preceding siblings ...)
  2022-02-23 22:17 ` christophm30 at gmail dot com
@ 2022-02-23 22:35 ` christophm30 at gmail dot com
  4 siblings, 0 replies; 6+ messages in thread
From: christophm30 at gmail dot com @ 2022-02-23 22:35 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104657

--- Comment #5 from Christoph Müllner <christophm30 at gmail dot com> ---
Creating hard-wired object references might be a solution, but there is a lot
of existing code out there, that would need to be patched (including all the
hassle with support for old and new compilers).

One example is the bootloader U-Boot, which does the following for ARM ([1]):
    #define __arch_putl(v,a)            (*(volatile unsigned int *)(a) = (v))

Another example is Linux, where read*()/write*() and friends do the following
([2]):
    # define __iomem
    void foo_linux(unsigned long v)
    {
        void __iomem *p = (void __iomem *)MEM_ADDR;
        *(volatile unsigned long *)p = v;
    }

FWIW, the __iomem expands in Linux as follows ([3]), if the sources are passed
to the semantic parser "sparse" ([4]):
    # define __iomem        __attribute__((noderef, address_space(__iomem)))
That's similar to the AVR solution but allows to create user-defined distinct
types.

[1]
https://source.denx.de/u-boot/u-boot/-/blob/master/arch/arm/include/asm/io.h#L50
[2]
https://elixir.bootlin.com/linux/latest/source/include/asm-generic/io.h#L125
[3]
https://elixir.bootlin.com/linux/latest/source/include/linux/compiler_types.h#L11
[4]
https://git.kernel.org/pub/scm/devel/sparse/sparse.git/tree/Documentation/annotations.rst

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

end of thread, other threads:[~2022-02-23 22:35 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-23 10:18 [Bug tree-optimization/104657] New: array subscript 0 is outside array bounds christophm30 at gmail dot com
2022-02-23 10:36 ` [Bug tree-optimization/104657] " pinskia at gcc dot gnu.org
2022-02-23 11:14 ` christophm30 at gmail dot com
2022-02-23 18:16 ` msebor at gcc dot gnu.org
2022-02-23 22:17 ` christophm30 at gmail dot com
2022-02-23 22:35 ` christophm30 at gmail dot com

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).