https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92765
Bug ID: 92765 Summary: [10 Regression] Wrong code caused by folding of -Wstring-compare since r276773 Product: gcc Version: 10.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: marxin at gcc dot gnu.org Target Milestone: --- I've just isolated following code snippet from tar package: $ cat buffer.c struct posix_header { char magic[2]; }; union Union { char buffer[512]; struct posix_header header; }; union Union a; union Union *ptr; int main(int argc, char **argv) { a.buffer[0] = 'a'; a.buffer[1] = 'b'; a.buffer[2] = '\0'; if (argc != 123) ptr = &a; if (__builtin_strcmp(ptr->header.magic, "x") == 0 || __builtin_strcmp(ptr->buffer + __builtin_offsetof(struct posix_header, magic), "ab") == 0) ; else __builtin_abort (); return 0; } $ gcc -Wstring-compare buffer.c -O2 && ./a.out buffer.c: In function ‘main’: buffer.c:23:10: warning: ‘__builtin_strcmp’ of a string of length 2 and an array of size 2 evaluates to nonzero [-Wstring-compare] 23 | || __builtin_strcmp(ptr->buffer + __builtin_offsetof(struct posix_header, magic), "ab") == 0) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Aborted (core dumped) $ gcc -Wstring-compare buffer.c && ./a.out [exits with 0]