[BUG] missing warning for pointer arithmetic out of bounds
Jonathan Wakely
jwakely.gcc@gmail.com
Tue Dec 13 20:45:44 GMT 2022
On Tue, 13 Dec 2022, 19:23 Paul Koning via Gcc, <gcc@gcc.gnu.org> wrote:
>
>
>
> > 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.
Yes, but printf doesn't take a void* argument.
>
> So a warning about char* being passed in seems to be flat out wrong.
I wouldn't say flat out wrong. It's wrong because the C standard
guarantees that void* and char* have the same representation and
alignment requirements, so no conversion is needed to pass a char*
through a varargs ellipsis where a void* is expected. But if it was
int* or struct X* then the warning would be correct (but not a problem
in practice on common arches, which is why Clang only enabels it with
-Wformat-pedantic).
>
> > 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.
No, clang is totally right here.
More information about the Gcc
mailing list