Alexey Izbyshev <[email protected]> added the comment:
I've been struggling with fixing spurious -Wclobbered GCC warnings. Originally,
I've got the following:
/scratch2/izbyshev/cpython/Modules/_posixsubprocess.c: In function
‘subprocess_fork_exec’:
/scratch2/izbyshev/cpython/Modules/_posixsubprocess.c:612:15: warning: variable
‘gc_module’ might be clobbered by ‘longjmp’ or ‘vfork’ [-Wclobbered]
PyObject *gc_module = NULL;
^~~~~~~~~
/scratch2/izbyshev/cpython/Modules/_posixsubprocess.c:616:15: warning: variable
‘preexec_fn_args_tuple’ might be clobbered by ‘longjmp’ or ‘vfork’ [-Wclobbered]
PyObject *preexec_fn_args_tuple = NULL;
^~~~~~~~~~~~~~~~~~~~~
/scratch2/izbyshev/cpython/Modules/_posixsubprocess.c:621:17: warning: variable
‘cwd’ might be clobbered by ‘longjmp’ or ‘vfork’ [-Wclobbered]
const char *cwd;
^~~
/scratch2/izbyshev/cpython/Modules/_posixsubprocess.c:623:9: warning: variable
‘need_to_reenable_gc’ might be clobbered by ‘longjmp’ or ‘vfork’ [-Wclobbered]
int need_to_reenable_gc = 0;
^~~~~~~~~~~~~~~~~~~
/scratch2/izbyshev/cpython/Modules/_posixsubprocess.c:624:38: warning: variable
‘argv’ might be clobbered by ‘longjmp’ or ‘vfork’ [-Wclobbered]
char *const *exec_array, *const *argv = NULL, *const *envp = NULL;
^~~~
/scratch2/izbyshev/cpython/Modules/_posixsubprocess.c:624:59: warning: variable
‘envp’ might be clobbered by ‘longjmp’ or ‘vfork’ [-Wclobbered]
char *const *exec_array, *const *argv = NULL, *const *envp = NULL;
^~~~
/scratch2/izbyshev/cpython/Modules/_posixsubprocess.c:626:9: warning: variable
‘need_after_fork’ might be clobbered by ‘longjmp’ or ‘vfork’ [-Wclobbered]
int need_after_fork = 0;
^~~~~~~~~~~~~~~
/scratch2/izbyshev/cpython/Modules/_posixsubprocess.c:627:9: warning: variable
‘saved_errno’ might be clobbered by ‘longjmp’ or ‘vfork’ [-Wclobbered]
int saved_errno = 0;
^~~~~~~~~~~
I've checked that all warnings are spurious: all flagged variables are either
not modified in the child or modified and used only by the child. A simple way
to suppress the warnings would be "volatile", but I don't want to spray
"volatile" over the huge declaration block of subprocess_fork_exec().
Another way is to move vfork() to a separate function and ensure that this
function does as little as possible with its local variables. I've implemented
two versions of this approach, both are ugly in some sense. I've pushed the
first into the PR branch and the second into a separate branch
https://github.com/izbyshev/cpython/tree/single-do-fork-exec.
Yet another way would be to simply disable this diagnostic for _posixsubprocess
(e.g. via #pragma GCC diagnostic), but I'm not sure we want to do that -- may
be it'll be fixed in the future or a real defect will be introduced into our
code.
----------
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue35823>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com