https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101042
Bug ID: 101042
Summary: Bogus -Wstringop-overread with 11.1.0 and -O1 because
of a call to printf _after_ assertions
Product: gcc
Version: 11.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: ypsah+6a11ea7d-369c-4db1-b3f4-60ced987a559 at devyard dot
org
Target Milestone: ---
Created attachment 50989
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=50989&action=edit
reproducer.c
Hi,
It looks like printf-ing a pointer after running assertions on it throws gcc 11
off:
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
enum field_type {
INTEGER,
STRING,
};
struct field {
enum field_type type;
union {
int integer;
const char *string;
};
};
int
main()
{
const struct field FIELD = {
.type = INTEGER,
.integer = 1,
};
struct field *field = calloc(1, sizeof(struct field));
assert(field);
assert(field->type == FIELD.type);
printf("field = %p\n", field);
switch (field->type) {
case STRING:
assert(strcmp(field->string, FIELD.string) == 0);
break;
default:
break;
}
free(field);
return 0;
}
$ gcc -Werror -O0 reproducer.c # <== Runs fine
$ gcc -Werror -O1 reproducer.c
In file included from reproducer.c:1:
reproducer.c: In function ‘main’:
reproducer.c:34:16: error: ‘strcmp’ reading 1 or more bytes from a region of
size 0 [-Werror=stringop-overread]
34 | assert(strcmp(field->string, FIELD.string) == 0);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
Any optimization level above 0 yields the warning.
If you remove the printf() statement, or place it before one of the two
assert(), the warning goes away.
Downgrading to 10.2.0 also fixes the issue.