Re: Suspicion of a compiler bug in clang: using ternary operator in ereport()

Поиск
Список
Период
Сортировка
От Christian Kruse
Тема Re: Suspicion of a compiler bug in clang: using ternary operator in ereport()
Дата
Msg-id 20140128211201.GD31380@defunct.ch
обсуждение исходный текст
Ответ на Suspicion of a compiler bug in clang: using ternary operator in ereport()  (Christian Kruse <christian@2ndQuadrant.com>)
Ответы Re: Suspicion of a compiler bug in clang: using ternary operator in ereport()  (Tom Lane <tgl@sss.pgh.pa.us>)
Re: Suspicion of a compiler bug in clang: using ternary operator in ereport()  (Jason Petersen <jason@citusdata.com>)
Список pgsql-hackers
Hi,

On 28/01/14 16:43, Christian Kruse wrote:
>         ereport(FATAL,
>                 (errmsg("could not map anonymous shared memory: %m"),
>                  (errno == ENOMEM) ?
>                  errhint("This error usually means that PostgreSQL's request "
>                          "for a shared memory segment exceeded available memory "
>                          "or swap space. To reduce the request size (currently "
>                          "%zu bytes), reduce PostgreSQL's shared memory usage, "
>                          "perhaps by reducing shared_buffers or "
>                          "max_connections.",
>                          *size) : 0));
>
> did not emit a errhint when using clang, although errno == ENOMEM was
> true. The same code works with gcc.

According to http://llvm.org/bugs/show_bug.cgi?id=18644#c5 this is not
a compiler bug but a difference between gcc and clang. Clang seems to
use a left-to-right order of evaluation while gcc uses a right-to-left
order of evaluation. So if errmsg changes errno this would lead to
errno == ENOMEM evaluated to false. I added a watch point on errno and
it turns out that exactly this happens: in src/common/psprintf.c line
114
nprinted = vsnprintf(buf, len, fmt, args);

errno gets set to 0. This means that we will miss errhint/errdetail if
we use errno in a ternary operator and clang.

Should we work on this issue?

Best regards,

-- Christian Kruse               http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training & Services


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

Предыдущее
От: Bruce Momjian
Дата:
Сообщение: Re: fixing pg_ctl with relative paths
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Suspicion of a compiler bug in clang: using ternary operator in ereport()