-
-
Notifications
You must be signed in to change notification settings - Fork 30.6k
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-104142: Fix _Py_RefcntAdd
to respect immortality
#104143
Conversation
🤖 New build scheduled with the buildbot fleet by @brandtbucher for commit be3b103 🤖 If you want to schedule another build, you need to add the 🔨 test-with-buildbots label again. |
(Not sure why buildbots aren't running...) |
@brandtbucher cpython/Modules/_testcapi/immortal.c Lines 34 to 38 in 9885677
cpython/Modules/_testcapi/immortal.c Lines 5 to 10 in 9885677
|
Ah sorry please ignore #104143 (comment) |
if (_Py_IsImmortal(op)) { | ||
return; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
One quick comment here is that if this were to be in a hot path, I would recommend using the same technique that we use for Py_INCREF
to minimize the number of generated instructions to do the check and add: https://github.com/python/cpython/blob/main/Include/object.h#L620-L634
Now, given that it's only in use for sq_repeat
in tuple and list, I don't think this is perf sensitive so keeping the code as you have it here should be good.
self.assertEqual(sys.getrefcount(immortal), self.IMMORTAL_REFCOUNT) | ||
|
||
def test_immortals(self): | ||
for immortal in self.IMMORTALS: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Small nit: I generally prefer rolling out assertions in unit tests to make it easier to isolate by line-number in the place where the test failed. But I don't think there's a standard in the code base so I'm fine either way
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, I'd like comprehensive testing of these immortals though, and I don't want to roll out ~250 different assertions for each test.
I figured making each one a subTest
in assert_immortal
is a pretty good compromise.
Nice catch, I could have sworn that I had added the check to Thanks for the fix! |
LGTM, all increments to |
There is a USan failure:
Not sure what that means, but the line is in _Py_IsImmortal (https://github.com/brandtbucher/cpython/blob/py-refcnt-add-immortal/Include/object.h#L227), so it may be real. |
🤖 New build scheduled with the buildbot fleet by @JelleZijlstra for commit 1471b39 🤖 If you want to schedule another build, you need to add the 🔨 test-with-buildbots label again. |
(Trying again just in case it was something flaky.) |
Grrr... it failed again. |
I honestly don't know what to do here. It feels like a bug in USan, since I honestly don't get how the new code could cause that failure. But it's reproducible, and indeed seems to indeed be related to my change here. |
Ah, wait, the same buildbot is also failing on So it's an existing issue (but one that probably should still be looked into). |
See #104190 |
Nice catch! |
* main: (61 commits) pythongh-64595: Argument Clinic: Touch source file if any output file changed (python#104152) pythongh-64631: Test exception messages in cloned Argument Clinic funcs (python#104167) pythongh-68395: Avoid naming conflicts by mangling variable names in Argument Clinic (python#104065) pythongh-64658: Expand Argument Clinic return converter docs (python#104175) pythonGH-103092: port `_asyncio` freelist to module state (python#104196) pythongh-104051: fix crash in test_xxtestfuzz with -We (python#104052) pythongh-104190: fix ubsan crash (python#104191) pythongh-104106: Add gcc fallback of mkfifoat/mknodat for macOS (pythongh-104129) pythonGH-104142: Fix _Py_RefcntAdd to respect immortality (pythonGH-104143) pythongh-104112: link from cached_property docs to method-caching FAQ (python#104113) pythongh-68968: Correcting message display issue with assertEqual (python#103937) pythonGH-103899: Provide a hint when accidentally calling a module (pythonGH-103900) pythongh-103963: fix 'make regen-opcode' in out-of-tree builds (python#104177) pythongh-102500: Add PEP 688 and 698 to the 3.12 release highlights (python#104174) pythonGH-81079: Add case_sensitive argument to `pathlib.Path.glob()` (pythonGH-102710) pythongh-91896: Deprecate collections.abc.ByteString (python#102096) pythongh-99593: Add tests for Unicode C API (part 2) (python#99868) pythongh-102500: Document PEP 688 (python#102571) pythongh-102500: Implement PEP 688 (python#102521) pythongh-96534: socketmodule: support FreeBSD divert(4) socket (python#96536) ...
Also, make the existing immortality tests a bit stricter and more comprehensive.
_Py_RefcntAdd
doesn't respect immortality #104142