> On Dec 13, 2022, at 2:08 PM, Alejandro Colomar via Gcc <gcc@gcc.gnu.org> 
> 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:
> 
>    $ 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;
>            ^     ~

I thought void * is a generic pointer that accepts any pointer argument.  So a 
warning about char* being passed in seems to be flat out wrong.

>    buf.c:5:2: note: array 'buf' declared here
>        char *p, buf[5];
>        ^
>    2 warnings generated.

That was discussed just days ago: C says that a pointer one past the end of the 
array is legal.  So here too it looks like Clang is wrong and GCC is right.

        paul

Reply via email to