-
-
Notifications
You must be signed in to change notification settings - Fork 31.1k
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
__static_attributes__
is not deterministic
#124442
Comments
This is because we store We could fix this either by using some structure other than a set (e.g., a dict with dummy values), or by sorting the attributes when we convert them from a set into a tuple. cc @iritkatriel |
This patch seems to fix it diff --git a/Python/compile.c b/Python/compile.c
index 7752a68..dfaa5a4 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -2544,7 +2544,14 @@ compiler_class_body(struct compiler *c, stmt_ty s, int firstlineno)
return ERROR;
}
assert(c->u->u_static_attributes);
- PyObject *static_attributes = PySequence_Tuple(c->u->u_static_attributes);
+ PyObject *static_attributes_unsorted = PySequence_List(c->u->u_static_attributes);
+ if (static_attributes_unsorted == NULL) {
+ compiler_exit_scope(c);
+ return ERROR;
+ }
+ PyList_Sort(static_attributes_unsorted);
+ PyObject *static_attributes = PySequence_Tuple(static_attributes_unsorted);
+ Py_CLEAR(static_attributes_unsorted);
if (static_attributes == NULL) {
compiler_exit_scope(c);
return ERROR; If it's ok I can open a pr to not waste core team time |
Go ahead and create a PR. Sorting at compile time prior to tupling will work. Another option would be to use a dict instead of a set which preserves insertion order. But I think it is much wiser for us to have the tuple always be in sorted order so that changes in the order of otherwise logically equivalent code do not result in different ordering in the tuple. |
@Yhg1s fyi (probably not a release blocker - distributors who need the canonical output here should wind up backporting the fix that we'd have for 3.13.1) |
__static_attributes__
is not deteministic
__static_attributes__
is not deteministic__static_attributes__
is not deterministic
…y sorting Signed-off-by: kp2pml30 <kp2pml30@gmail.com>
…y sorting Signed-off-by: kp2pml30 <kp2pml30@gmail.com>
…y sorting Signed-off-by: kp2pml30 <kp2pml30@gmail.com>
…y sorting Signed-off-by: kp2pml30 <kp2pml30@gmail.com>
…4492) Signed-off-by: kp2pml30 <kp2pml30@gmail.com> Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com> Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
… sorting (pythonGH-124492) (cherry picked from commit 04c837d) Co-authored-by: Kira <kp2pml30@gmail.com> Signed-off-by: kp2pml30 <kp2pml30@gmail.com> Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com> Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
…ng (GH-124492) (#124738) * [3.13] gh-124442: make `__static_attributes__` deterministic by sorting (GH-124492) (cherry picked from commit 04c837d) Co-authored-by: Kira <kp2pml30@gmail.com> Signed-off-by: kp2pml30 <kp2pml30@gmail.com> Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com> Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>
Can this be closed? I don't think we need more deterministic processing. |
Bug report
Bug description:
Tested on commit: e9b00cc
Order of strings in
__static_attributes__
is not deterministicRunning the following a couple of times produces different hashes:
I patched this generator to output dis as follows:
Then disassembly differs in one place (after removing
at 0x[a-f0-9]*
):diff in
.h
files is quite small, so I assume only sorting is affected:CPython versions tested on:
3.13
Operating systems tested on:
No response
Linked PRs
__static_attributes__
deterministic by sorting #124492__static_attributes__
deterministic by sorting (GH-124492) #124738The text was updated successfully, but these errors were encountered: