Thread
Commits
-
Be more rigorous about local variables in PostgresMain().
- a8b7424684b3 17.0 landed
- 93dcdfa88f5f 16.0 landed
- 6b51fe8340bb 13.12 landed
- 671bf1cf27cf 11.21 landed
- 48582cf9ed96 14.9 landed
- 22447db17cc0 15.4 landed
- 0c32818d7559 12.16 landed
-
gcc -Wclobbered in PostgresMain
Sergey Shinderuk <s.shinderuk@postgrespro.ru> — 2023-07-07T12:13:14Z
Hi, hackers! While analyzing -Wclobbered warnings from gcc we found a true one in PostgresMain(): postgres.c: In function ‘PostgresMain’: postgres.c:4118:25: warning: variable ‘idle_in_transaction_timeout_enabled’ might be clobbered by ‘longjmp’ or ‘vfork’ [-Wclobbered] 4118 | bool idle_in_transaction_timeout_enabled = false; | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ postgres.c:4119:25: warning: variable ‘idle_session_timeout_enabled’ might be clobbered by ‘longjmp’ or ‘vfork’ [-Wclobbered] 4119 | bool idle_session_timeout_enabled = false; | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ These variables must be declared volatile, because they are read after longjmp(). send_ready_for_query declared there is volatile. Without volatile, these variables are kept in registers and restored by longjump(). I think, this is harmless because the error handling code calls disable_all_timeouts() anyway. But strictly speaking the code is invoking undefined behavior by reading those variables after longjmp(), so it's worth fixing. And for consistency with send_ready_for_query too. I believe, making them volatile doesn't affect performance in any way. I also moved firstchar's declaration inside the loop where it's used, to make it clear that this variable needn't be volatile and is not preserved after longjmp(). Best regards, -- Sergey Shinderuk https://postgrespro.com/ -
Re: gcc -Wclobbered in PostgresMain
Tom Lane <tgl@sss.pgh.pa.us> — 2023-07-08T15:11:22Z
Sergey Shinderuk <s.shinderuk@postgrespro.ru> writes: > While analyzing -Wclobbered warnings from gcc we found a true one in > PostgresMain(): > ... > These variables must be declared volatile, because they are read after > longjmp(). send_ready_for_query declared there is volatile. Yeah, you're on to something there. > Without volatile, these variables are kept in registers and restored by > longjump(). I think, this is harmless because the error handling code > calls disable_all_timeouts() anyway. Hmm. So what could happen (if these *aren't* in registers) is that we might later uselessly call disable_timeout to get rid of timeouts that are long gone anyway. While that's not terribly expensive, it's not great either. What we ought to be doing is resetting these two flags after the disable_all_timeouts call. Having done that, it wouldn't really be necessary to mark these as volatile. I kept that marking anyway for consistency with send_ready_for_query, but perhaps we shouldn't? > I also moved firstchar's declaration inside the loop where it's used, to > make it clear that this variable needn't be volatile and is not > preserved after longjmp(). Good idea, but then why not the same for input_message? It's fully reinitialized each time through the loop, too. In short, something like the attached, except I'm not totally sold on changing the volatility of the timeout flags. regards, tom lane
-
Re: gcc -Wclobbered in PostgresMain
Sergey Shinderuk <s.shinderuk@postgrespro.ru> — 2023-07-10T09:39:52Z
Hello, Tom, On 08.07.2023 18:11, Tom Lane wrote: > What we ought to be doing is resetting these two flags > after the disable_all_timeouts call. Oops, I missed that. > Having done that, it wouldn't really be necessary to mark these > as volatile. I kept that marking anyway for consistency with > send_ready_for_query, but perhaps we shouldn't? I don't know. Maybe marking them volatile is more future proof. Not sure. >> I also moved firstchar's declaration inside the loop where it's used, to >> make it clear that this variable needn't be volatile and is not >> preserved after longjmp(). > > Good idea, but then why not the same for input_message? It's fully > reinitialized each time through the loop, too. Yeah, that's better. > In short, something like the attached, except I'm not totally sold > on changing the volatility of the timeout flags. Looks good to me. Thank you. -- Sergey Shinderuk https://postgrespro.com/
-
Re: gcc -Wclobbered in PostgresMain
Tom Lane <tgl@sss.pgh.pa.us> — 2023-07-10T16:17:19Z
Sergey Shinderuk <s.shinderuk@postgrespro.ru> writes: > On 08.07.2023 18:11, Tom Lane wrote: >> Having done that, it wouldn't really be necessary to mark these >> as volatile. I kept that marking anyway for consistency with >> send_ready_for_query, but perhaps we shouldn't? > I don't know. Maybe marking them volatile is more future proof. Not sure. Yeah, after sleeping on it, it seems best to have a policy that all variables declared in that place are volatile. Even if there's no bug now, not having volatile creates a risk of surprising behavior after future changes. Pushed that way. regards, tom lane