Hi Paul, On 12/13/22 20:22, Paul Koning wrote: > > >> On Dec 13, 2022, at 2:08 PM, Alejandro Colomar via Gcc wrote: >> >> Hi! >> >> For the following program: >> >> >> $ cat buf.c >> #include >> >> 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. Look again: char *p, buf[5]; p = buf + 6; That's a pointer two-past-the-end; not one. That's UB. Cheers, Alex > > paul > --