https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101451
--- Comment #5 from Quentin Armitage <quentin at armitage dot org.uk> --- In the code of my original example (which I have simplified) =================================== #include <string.h> static char dest[16]; static char src[16] = "012345678901234"; int main(__attribute__(void) { do { dest[0] = '\0'; strncat(dest, src, sizeof(dest) - 1); } while (0); } ================================== there is no truncation since 15 bytes are copied to dest, with a NUL byte added, and the maximum length of a string in src is 15 bytes plus terminating NUL byte. Also, the warning is not generated if -O2 is not specified, but it is generated if -O2 is specified (-O1 does not generate the warning). To me this doesn't seem right.