Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

GH-104142: Fix_Py_RefcntAdd to respect immortality#104143

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 ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged

Conversation

brandtbucher
Copy link
Member

@brandtbucherbrandtbucher commentedMay 3, 2023
edited by bedevere-bot
Loading

Also, make the existing immortality tests a bit stricter and more comprehensive.

eduardo-elizondo reacted with thumbs up emoji
@brandtbucherbrandtbucher added interpreter-core(Objects, Python, Grammar, and Parser dirs) release-blocker labelsMay 3, 2023
@brandtbucherbrandtbucher self-assigned thisMay 3, 2023
@brandtbucherbrandtbucher added the 🔨 test-with-buildbotsTest PR w/ buildbots; report in status section labelMay 3, 2023
@bedevere-bot
Copy link

🤖 New build scheduled with the buildbot fleet by@brandtbucher for commitbe3b103 🤖

If you want to schedule another build, you need to add the🔨 test-with-buildbots label again.

@bedevere-botbedevere-bot removed the 🔨 test-with-buildbotsTest PR w/ buildbots; report in status section labelMay 3, 2023
@ericsnowcurrently
Copy link
Member

CC@eduardo-elizondo

@brandtbucher
Copy link
MemberAuthor

(Not sure why buildbots aren't running...)

corona10
corona10 previously approved these changesMay 4, 2023
@corona10
Copy link
Member

corona10 commentedMay 4, 2023
edited
Loading

@brandtbucherAh would you like to add the C API test in here too?

staticPyMethodDeftest_methods[]= {
{"test_immortal_builtins",test_immortal_builtins,METH_NOARGS},
{"test_immortal_small_ints",test_immortal_small_ints,METH_NOARGS},
{NULL},
};

Adding a code line somewhere of here would be enough.

assert(_Py_IsImmortal(object));
Py_ssize_told_count=Py_REFCNT(object);
for (intj=0;j<10000;j++) {
Py_DECREF(object);
}
Py_ssize_tcurrent_count=Py_REFCNT(object);

@corona10
Copy link
Member

corona10 commentedMay 4, 2023
edited
Loading

Ah sorry please ignore#104143 (comment)
it's not public API...

brandtbucher reacted with thumbs up emoji

Comment on lines +61 to +63
if (_Py_IsImmortal(op)) {
return;
}
Copy link
Contributor

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 forPy_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 forsq_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.

brandtbucher and itamaro reacted with thumbs up emoji
self.assertEqual(sys.getrefcount(immortal), self.IMMORTAL_REFCOUNT)

def test_immortals(self):
for immortal in self.IMMORTALS:
Copy link
Contributor

@eduardo-elizondoeduardo-elizondoMay 4, 2023
edited
Loading

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

brandtbucher reacted with thumbs up emoji
Copy link
MemberAuthor

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 asubTest inassert_immortal is a pretty good compromise.

@eduardo-elizondo
Copy link
Contributor

eduardo-elizondo commentedMay 4, 2023
edited
Loading

Nice catch, I could have sworn that I had added the check to_Py_RefcntAdd as well but I somehow missed it. I added two comments but they are minor so this LGTM.

Thanks for the fix!

brandtbucher reacted with thumbs up emoji

@sunmy2019
Copy link
Member

LGTM, all increments toob->ob_refcnt should be guarded now.

@JelleZijlstra
Copy link
Member

There is a USan failure:

Include/object.h:227:12: runtime error: member access within address 0x7fff7ae78b80 with insufficient space for an object of type 'PyObject' (aka 'struct _object')0x7fff7ae78b80: note: pointer points here b8 7f 00 00  00 47 a8 c2 97 55 00 00  00 b5 59 7e 78 cd 65 f5  00 8a ea c2 b8 7f 00 00  39 7a 90 c0              ^ SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior Include/object.h:227:12 in make: *** [Makefile:1106: checksharedmods] Error 1

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.

@JelleZijlstraJelleZijlstra added the 🔨 test-with-buildbotsTest PR w/ buildbots; report in status section labelMay 4, 2023
@bedevere-bot
Copy link

🤖 New build scheduled with the buildbot fleet by@JelleZijlstra for commit1471b39 🤖

If you want to schedule another build, you need to add the🔨 test-with-buildbots label again.

@bedevere-botbedevere-bot removed the 🔨 test-with-buildbotsTest PR w/ buildbots; report in status section labelMay 4, 2023
@JelleZijlstra
Copy link
Member

(Trying again just in case it was something flaky.)

brandtbucher reacted with thumbs up emoji

@brandtbucher
Copy link
MemberAuthor

Grrr... it failed again.

@brandtbucher
Copy link
MemberAuthor

I honestly don't know what to do here.

Itfeels 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.

@brandtbucher
Copy link
MemberAuthor

Ah, wait, the same buildbot is also failing onmain:https://buildbot.python.org/all/#/builders/719/builds/2611

So it's an existing issue (but one that probably should still be looked into).

JelleZijlstra reacted with thumbs up emoji

@brandtbucherbrandtbucher merged commitce871fd intopython:mainMay 5, 2023
@sunmy2019
Copy link
Member

So it's an existing issue (but one that probably should still be looked into).

See#104190

eduardo-elizondo reacted with heart emoji

@brandtbucher
Copy link
MemberAuthor

Nice catch!

carljm added a commit to carljm/cpython that referenced this pull requestMay 5, 2023
* 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)  ...
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Reviewers

@corona10corona10corona10 approved these changes

@eduardo-elizondoeduardo-elizondoeduardo-elizondo approved these changes

@ericsnowcurrentlyericsnowcurrentlyAwaiting requested review from ericsnowcurrently

Assignees

@brandtbucherbrandtbucher

Labels
interpreter-core(Objects, Python, Grammar, and Parser dirs)release-blocker
Projects
Milestone
No milestone
Development

Successfully merging this pull request may close these issues.

7 participants
@brandtbucher@bedevere-bot@ericsnowcurrently@corona10@eduardo-elizondo@sunmy2019@JelleZijlstra

[8]ページ先頭

©2009-2025 Movatter.jp