mcvstats serialization code is still shy of a load

Поиск
Список
Период
Сортировка
От Tom Lane
Тема mcvstats serialization code is still shy of a load
Дата
Msg-id 2201.1561521148@sss.pgh.pa.us
обсуждение исходный текст
Ответы Re: mcvstats serialization code is still shy of a load  (Tomas Vondra <tomas.vondra@2ndquadrant.com>)
Список pgsql-hackers
I'm seeing a reproducible bus error here:

#0  0x00417420 in statext_mcv_serialize (mcvlist=0x62223450, stats=Variable "stats" is not available.
)
    at mcv.c:785
785                     memcpy(ITEM_BASE_FREQUENCY(item, ndims), &mcvitem->base_frequency, sizeof(double));

What appears to be happening is that since ITEM_BASE_FREQUENCY is defined as

#define ITEM_BASE_FREQUENCY(item,ndims)    ((double *) (ITEM_FREQUENCY(item, ndims) + 1))

the compiler is assuming that the first argument to memcpy is
double-aligned, and it is generating code that depends on that being
true, and of course it isn't true and kaboom.

You can *not* cast something to an aligned pointer type if it's not
actually certain to be aligned suitably for that type.  In this example,
even if you wrote "(char *)" in front of this, it wouldn't save you;
the compiler would still be entitled to believe that the intermediate
cast value meant something.  The casts in the underlying macros
ITEM_FREQUENCY and so on are equally unsafe.

(For the record, this is with gcc 4.2.1 on OpenBSD/hppa 6.4.)

            regards, tom lane



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: [HACKERS] Regression tests vs existing users in an installation
Следующее
От: Michael Paquier
Дата:
Сообщение: Re: fsync error handling in pg_receivewal, pg_recvlogical