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 по дате отправления: