https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90525
--- Comment #3 from Martin Sebor <msebor at gcc dot gnu.org> --- The part of -Warray-bounds that checks offsets in calls to built-ins (as opposed to the subscript operator) is a part of the -Wrestrict implementation. It exists mainly to avoid some pathological instances of the latter warning in corner cases. Its goal isn't so much to detect writing past the end but to catch invalid pointers formed by calls to the built-ins. The warning also detects past-the-end reads, including reads of padding bytes (this also isn't necessarily by design, it just falls out of the invalid pointer checking). struct A { char a[2]; int c; } t; void f (void *p) { __builtin_strcpy (t.a, "abc"); // no warning here :( __builtin_strcpy (p, t.a); // but -Warray-bounds here } With that said, I agree the warning could be improved/made clearer. The above is just to explain why it works the way it does.