-
-
Notifications
You must be signed in to change notification settings - Fork 30.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
gh-98724: Fix Py_CLEAR() macro side effects (#99100) #100070
Conversation
✅ Deploy Preview for python-cpython-preview ready!
To edit notification comments on pull requests, go to your Netlify site settings. |
cc @serge-sans-paille @erlend-aasland: This version should no longer miscompile Python: it avoids the type punning issue thanks to memcpy(). I wrote a comment in Py_CLEAR() to explain the rationale for memcpy(). |
This PR no longer reintroduces the miscompilation bug: issue #99701. I tested manually. I tested this PR with this local patch (otherwise the output is just too verbose!): diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 8209132ebc..cf243c8ef9 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -1891,9 +1891,6 @@ Py_FinalizeEx(void)
/* Destroy all modules */
finalize_modules(tstate);
- /* Print debug stats if any */
- _PyEval_Fini();
-
/* Flush sys.stdout and sys.stderr (again, in case more was printed) */
if (flush_std_files() < 0) {
status = -1; Test command:
The test succeeded with |
I updated my PR to use My previous attempt PR #99739 always used |
I ran my test for 4 cases and all succeeded:
|
To also emit a warning in the memcpy() implementation, @serge-sans-paille suggested to me using I'm not sure about this one. Maybe this enhancement can be made later, once the initial issue #98724 is fixed with my current PR implementation. So it's easy to revert if something goes wrong. |
test_ast.test_recursion_direct() crash with a stack overflow. It sounds unrelated to this change. The ARM64 Windows 3.x buildbot is sick for 2 days: it fails with "exception" (don't build+test Python).
|
The Py_CLEAR(), Py_SETREF() and Py_XSETREF() macros now only evaluate their arguments once. If an argument has side effects, these side effects are no longer duplicated. Use temporary variables to avoid duplicating side effects of macro arguments side effects. If available, use _Py_TYPEOF() to avoid type punning. Otherwise, use memcpy() for the assignment to prevent a miscompilation with strict aliasing caused by type punning. Add _Py_TYPEOF() macro: __typeof__() on GCC and clang. Add test_py_clear() and test_py_setref() unit tests to _testcapi.
Apart of the sick "ARM64 Windows 3.x" buildbot, all buildbots were happy with this change. I fixed a fix typos. I amended the commit message. |
FYI I proposed #100104 to fix this bug (unrelated to this change). |
The Py_CLEAR(), Py_SETREF() and Py_XSETREF() macros now only evaluate their arguments once. If an argument has side effects, these side effects are no longer duplicated.
Use temporary variables to avoid duplicating side effects of macro arguments side effects. Use memcpy() for assignment to prevent a miscompilation with strict aliasing caused by type punning.
Add test_py_clear() and test_py_setref() unit tests to _testcapi.