reject arbitrary attribute assignment on bound methods#4201
Open
knQzx wants to merge 1 commit into
Open
Conversation
A bound method is a types.MethodType, which does not override __setattr__/__delattr__, so assigning an arbitrary attribute to it fails at runtime. Pyrefly permitted it: lookup_magic_dunder_attr1 had no BoundMethod arm, so the base fell through to the general lookup and resolved __setattr__/__delattr__ via MethodType.__getattr__ (which returns Any), making the assignment look valid. Add a BoundMethod arm mirroring the ClassInstance handling: when the mutating dunder is inherited from object, report the attribute as not-found so the set/delete is rejected. Attribute reads are unchanged. Closes facebook#4163
|
Diff from mypy_primer, showing the effect of this PR on open source code: dragonchain (https://github.com/dragonchain/dragonchain)
+ ERROR dragonchain/transaction_processor/level_5_actions_utest.py:256:9-81: Object of class `FunctionType` has no attribute `return_value` [missing-attribute]
+ ERROR dragonchain/transaction_processor/level_5_actions_utest.py:275:9-80: Object of class `FunctionType` has no attribute `side_effect` [missing-attribute]
+ ERROR dragonchain/transaction_processor/level_5_actions_utest.py:294:9-81: Object of class `FunctionType` has no attribute `return_value` [missing-attribute]
+ ERROR dragonchain/transaction_processor/level_5_actions_utest.py:312:9-81: Object of class `FunctionType` has no attribute `return_value` [missing-attribute]
|
Contributor
Author
|
heads up on the mypy_primer diff: the 4 new errors on dragonchain are all the |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
a bound method is a
types.MethodType, which doesn't override__setattr__/__delattr__, so assigning an arbitrary attribute to it fails at runtime. pyrefly allowed it:lookup_magic_dunder_attr1had noBoundMethodarm, so the base fell through to the general lookup and resolved the dunder viaMethodType.__getattr__(returnsAny), which made the assignment look validadd a
BoundMethodarm mirroring theClassInstancehandling: when the mutating dunder is inherited fromobject, report it as not-found so the set/delete is rejected. attribute reads are unchangedcloses #4163