On Tue, Dec 13, 2022 at 11:16 AM Alejandro Colomar via Gcc
<gcc@gcc.gnu.org> wrote:
>
>
>
> On 12/13/22 20:08, Alejandro Colomar wrote:
> > Hi!
> >
> > For the following program:
> >
> >
> >      $ cat buf.c
> >      #include <stdio.h>
> >
> >      int main(void)
> >      {
> >          char *p, buf[5];
> >
> >          p = buf + 6;
> >          printf("%p\n", p);
> >      }
> >
> >
> > There are no warnings in gcc, as I would expect:
>
> I just re-read my text, and it is ambiguous.  I meant that I expect warnings.

GCC only warns during VRP which is only enabled at -O2:

<source>:8:12: warning: array subscript 6 is outside array bounds of
'char[5]' [-Warray-bounds=]
    8 |          p = buf + 6;
      |          ~~^~~~~~~~~
<source>:6:19: note: at offset 6 into object 'buf' of size 5
    6 |          char *p, buf[5];
      |                   ^~~

Thanks,
Andrew


>
>
> >
> >      $ gcc -Wall -Wextra buf.c -O0
> >
> > Clang does warn, however:
> >
> >      $ clang -Weverything -Wall -Wextra buf.c -O0
> >      buf.c:8:17: warning: format specifies type 'void *' but the argument 
> > has
> > type 'char *' [-Wformat-pedantic]
> >          printf("%p\n", p);
> >                  ~~     ^
> >                  %s
> >      buf.c:7:6: warning: the pointer incremented by 6 refers past the end 
> > of the
> > array (that contains 5 elements) [-Warray-bounds-pointer-arithmetic]
> >          p = buf + 6;
> >              ^     ~
> >      buf.c:5:2: note: array 'buf' declared here
> >          char *p, buf[5];
> >          ^
> >      2 warnings generated.
> >
> > Cheers,
> >
> > Alex
> >
> >
>
> --
> <http://www.alejandro-colomar.es/>

Reply via email to