Skip to content

Adaptive opcodes neglect EXTENDED_ARG #91625

Closed

Description

@sweeneyde

Reproducer:

def f(x):
    # UNPACK_SEQUENCE 400
    # is actually
    #     EXTENDED_ARG 1
    #     UNPACK_SEQUENCE 144
    (
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,

        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,

        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,

        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
        y,y,y,y,y, y,y,y,y,y, y,y,y,y,y, y,y,y,y,y,
    ) = x

# 0..7 get printed out before we get 
# ValueError: too many values to unpack (expected 144)
for i in range(30):
    print(i)
    f(range(400))

This is the problematic bit of C code:

                next_instr--;
                _Py_Specialize_UnpackSequence(seq, next_instr, oparg);
                DISPATCH();

Activity

  1. sweeneyde commented on Apr 17, 2022

    @sweeneyde
    MemberAuthor
  2. sweeneyde commented on Apr 17, 2022

    @sweeneyde
    MemberAuthor

    Similar thing for LOAD_GLOBAL:

    Details
    code = """
    def f():
        y=(a0+a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15+a16+a17+a18+a19+
        a20+a21+a22+a23+a24+a25+a26+a27+a28+a29+a30+a31+a32+a33+a34+a35+a36+a37+a38+a39+
        a40+a41+a42+a43+a44+a45+a46+a47+a48+a49+a50+a51+a52+a53+a54+a55+a56+a57+a58+a59+
        a60+a61+a62+a63+a64+a65+a66+a67+a68+a69+a70+a71+a72+a73+a74+a75+a76+a77+a78+a79+
        a80+a81+a82+a83+a84+a85+a86+a87+a88+a89+a90+a91+a92+a93+a94+a95+a96+a97+a98+a99+
        a100+a101+a102+a103+a104+a105+a106+a107+a108+a109+a110+a111+a112+a113+a114+a115+a116+a117+a118+a119+
        a120+a121+a122+a123+a124+a125+a126+a127+a128+a129+a130+a131+a132+a133+a134+a135+a136+a137+a138+a139+
        a140+a141+a142+a143+a144+a145+a146+a147+a148+a149+a150+a151+a152+a153+a154+a155+a156+a157+a158+a159+
        a160+a161+a162+a163+a164+a165+a166+a167+a168+a169+a170+a171+a172+a173+a174+a175+a176+a177+a178+a179+
        a180+a181+a182+a183+a184+a185+a186+a187+a188+a189+a190+a191+a192+a193+a194+a195+a196+a197+a198+a199+
        a200+a201+a202+a203+a204+a205+a206+a207+a208+a209+a210+a211+a212+a213+a214+a215+a216+a217+a218+a219+
        a220+a221+a222+a223+a224+a225+a226+a227+a228+a229+a230+a231+a232+a233+a234+a235+a236+a237+a238+a239+
        a240+a241+a242+a243+a244+a245+a246+a247+a248+a249+a250+a251+a252+a253+a254+a255+a256+a257+a258+a259+
        a260+a261+a262+a263+a264+a265+a266+a267+a268+a269+a270+a271+a272+a273+a274+a275+a276+a277+a278+a279+
        a280+a281+a282+a283+a284+a285+a286+a287+a288+a289+a290+a291+a292+a293+a294+a295+a296+a297+a298+a299+
        a300+a301+a302+a303+a304+a305+a306+a307+a308+a309+a310+a311+a312+a313+a314+a315+a316+a317+a318+a319)
        return y
    """
    class D(dict):
        def __missing__(self, key):
            return int(key.removeprefix("a"))
    ns = D()
    exec(code, ns)
    f = ns["f"]
    
    for i in range(12):
        print(f())
    # 51040
    # 51040
    # 51040
    # 51040
    # 51040
    # 51040
    # 51040
    # 18272
    # 51040
    # 51040
    # 51040
    # 51040
  3. sweeneyde commented on Apr 17, 2022

    @sweeneyde
    MemberAuthor

    Same thing with LOAD_ATTR:

    Details
    class A:
        def __getattr__(self, attr):
            return int(attr.removeprefix("a"))
    a = A()
    
    def f():
        y=(a.a0+a.a1+a.a2+a.a3+a.a4+a.a5+a.a6+a.a7+a.a8+a.a9+a.a10+a.a11+a.a12+a.a13+a.a14+a.a15+a.a16+a.a17+a.a18+a.a19+
        a.a20+a.a21+a.a22+a.a23+a.a24+a.a25+a.a26+a.a27+a.a28+a.a29+a.a30+a.a31+a.a32+a.a33+a.a34+a.a35+a.a36+a.a37+a.a38+a.a39+
        a.a40+a.a41+a.a42+a.a43+a.a44+a.a45+a.a46+a.a47+a.a48+a.a49+a.a50+a.a51+a.a52+a.a53+a.a54+a.a55+a.a56+a.a57+a.a58+a.a59+
        a.a60+a.a61+a.a62+a.a63+a.a64+a.a65+a.a66+a.a67+a.a68+a.a69+a.a70+a.a71+a.a72+a.a73+a.a74+a.a75+a.a76+a.a77+a.a78+a.a79+
        a.a80+a.a81+a.a82+a.a83+a.a84+a.a85+a.a86+a.a87+a.a88+a.a89+a.a90+a.a91+a.a92+a.a93+a.a94+a.a95+a.a96+a.a97+a.a98+a.a99+
        a.a100+a.a101+a.a102+a.a103+a.a104+a.a105+a.a106+a.a107+a.a108+a.a109+a.a110+a.a111+a.a112+a.a113+a.a114+a.a115+a.a116+a.a117+a.a118+a.a119+
        a.a120+a.a121+a.a122+a.a123+a.a124+a.a125+a.a126+a.a127+a.a128+a.a129+a.a130+a.a131+a.a132+a.a133+a.a134+a.a135+a.a136+a.a137+a.a138+a.a139+
        a.a140+a.a141+a.a142+a.a143+a.a144+a.a145+a.a146+a.a147+a.a148+a.a149+a.a150+a.a151+a.a152+a.a153+a.a154+a.a155+a.a156+a.a157+a.a158+a.a159+
        a.a160+a.a161+a.a162+a.a163+a.a164+a.a165+a.a166+a.a167+a.a168+a.a169+a.a170+a.a171+a.a172+a.a173+a.a174+a.a175+a.a176+a.a177+a.a178+a.a179+
        a.a180+a.a181+a.a182+a.a183+a.a184+a.a185+a.a186+a.a187+a.a188+a.a189+a.a190+a.a191+a.a192+a.a193+a.a194+a.a195+a.a196+a.a197+a.a198+a.a199+
        a.a200+a.a201+a.a202+a.a203+a.a204+a.a205+a.a206+a.a207+a.a208+a.a209+a.a210+a.a211+a.a212+a.a213+a.a214+a.a215+a.a216+a.a217+a.a218+a.a219+
        a.a220+a.a221+a.a222+a.a223+a.a224+a.a225+a.a226+a.a227+a.a228+a.a229+a.a230+a.a231+a.a232+a.a233+a.a234+a.a235+a.a236+a.a237+a.a238+a.a239+
        a.a240+a.a241+a.a242+a.a243+a.a244+a.a245+a.a246+a.a247+a.a248+a.a249+a.a250+a.a251+a.a252+a.a253+a.a254+a.a255+a.a256+a.a257+a.a258+a.a259+
        a.a260+a.a261+a.a262+a.a263+a.a264+a.a265+a.a266+a.a267+a.a268+a.a269+a.a270+a.a271+a.a272+a.a273+a.a274+a.a275+a.a276+a.a277+a.a278+a.a279+
        a.a280+a.a281+a.a282+a.a283+a.a284+a.a285+a.a286+a.a287+a.a288+a.a289+a.a290+a.a291+a.a292+a.a293+a.a294+a.a295+a.a296+a.a297+a.a298+a.a299)
        return y
    
    for i in range(12):
        print(f())
    # 44850
    # 44850
    # 44850
    # 44850
    # 44850
    # 44850
    # 44850
    # Traceback (most recent call last):
    #   File "C:\Users\sween\Source\Repos\cpython2\cpython\unpack.py", line 26, in <module>
    #     print(f())
    #           ^^^
    #   File "C:\Users\sween\Source\Repos\cpython2\cpython\unpack.py", line 20, in f
    #     a.a240+a.a241+a.a242+a.a243+a.a244+a.a245+a.a246+a.a247+a.a248+a.a249+a.a250+a.a251+a.a252+a.a253+a.a254+a.a255+a.a256+a.a257+a.a258+a.a259+
    #                                                                                                              ^^^^^^
    #   File "C:\Users\sween\Source\Repos\cpython2\cpython\unpack.py", line 4, in __getattr__
    #     return int(attr.removeprefix("a"))
    #            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    # ValueError: invalid literal for int() with base 10: ''
  4. changed the title [-]UNPACK_SEQUENCE specializations neglect EXTENDED_ARG[/-] [+]Adaptive opcodes neglect EXTENDED_ARG[/+] on Apr 17, 2022
  5. added a commit that references this issue on Apr 17, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.11only security fixesinterpreter-core(Objects, Python, Grammar, and Parser dirs)release-blockertype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions