[Bug c/85260] [8 Regression] python-2.7.14 miscompiled at -O3
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Apr 6 17:16:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85260
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |dmalcolm at gcc dot gnu.org,
| |rsandifo at gcc dot gnu.org
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Actually, it seems to be a python bug to me.
Reduced testcase:
typedef struct S {
long ob_refcnt;
void *ob_type;
void *in_class;
void *in_dict;
void *in_weakreflist;
} PyClassObject;
PyClassObject *foo (void);
typedef union U {
struct {
union U *gc_next;
union U *gc_prev;
long gc_refs;
} gc;
long double dummy;
} PyGC_Head;
void *
bar (void *klass, void *dict)
{
PyClassObject *inst = foo ();
inst->in_class = klass;
inst->in_dict = dict;
PyGC_Head *g = (PyGC_Head *)inst - 1;
g->gc.gc_prev->gc.gc_next = g;
return inst;
}
While PyClassObject seems to have 8-byte alignment, the code assumes there is a
PYGC_Head object in front of it, and that because of the long double member has
16-byte alignment. So, I believe if the function (_PyObject_GC_New in the
original testcase) returns something that is not 16-byte aligned, which is what
happens when it segfaults, then it is an application bug - UB because
g->gc.gc_prev is then access to misaligned *g. Richard's changes derive
alignment information from that access and assume that inst must be also
16-byte aligned.
More information about the Gcc-bugs
mailing list