Re: pgsql: pg_logicalinspect: Fix possible crash when passing a directory p

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: pgsql: pg_logicalinspect: Fix possible crash when passing a directory p
Дата
Msg-id 1244428.1752677780@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: pgsql: pg_logicalinspect: Fix possible crash when passing a directory p  (David Rowley <dgrowleyml@gmail.com>)
Ответы Re: pgsql: pg_logicalinspect: Fix possible crash when passing a directory p
Список pgsql-committers
[ this thread was referenced recently, bringing it back top-of-mind ]

David Rowley <dgrowleyml@gmail.com> writes:
> On Thu, 13 Mar 2025 at 21:33, Peter Eisentraut <peter@eisentraut.org> wrote:
>> Is there a way to reshuffle those conditionals to make this actually do
>> something useful on MSVC?

> I've just been experimenting with this and it seems the problem isn't
> with pg_unreachable(), it's with the compiler not understanding that
> the particular pg_unreachable() is always reached.

> What's happening is down to the multi-eval protection code for elevel
> in ereport_domain().  Because elevel is assigned to the variable
> "elevel_" the compiler seems to lose its proof that the
> pg_unreachable() is always reached.  Adjusting that condition to use
> the elevel parameter directly makes the warning disappear.

Looking again at the code for ereport_domain(), I wondered if
something like this would help MSVC see through it:

 #define ereport_domain(elevel, domain, ...)    \
    do { \
        const int elevel_ = (elevel); \
+       const bool is_error_ = (elevel_ >= ERROR); \
        pg_prevent_errno_in_scope(); \
        if (errstart(elevel_, domain)) \
            __VA_ARGS__, errfinish(__FILE__, __LINE__, __func__); \
-       if (elevel_ >= ERROR) \
+       if (is_error_) \
            pg_unreachable(); \
    } while(0)

This preserves single evaluation of the elevel parameter, and
perhaps it'd move the needle on whether the compiler thinks
is_error_ is a compile-time constant.  I'm just guessing
though, don't have this compiler to test with.

            regards, tom lane



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