8000 Negative indexing in free-threading can access data that never lived at that index · Issue #130744 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

Negative indexing in free-threading can access data that never lived at that index #130744

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

Closed
tom-pytel opened this issue Mar 1, 2025 · 2 comments
Labels
interpreter-core (Objects, Python, Grammar, and Parser dirs) topic-free-threading type-bug An unexpected behavior, bug, or error

Comments

@tom-pytel
Copy link
Contributor
tom-pytel commented Mar 1, 2025

Bug report

Bug description:

The place that negative indices for lists are offset currently in the free-threaded build can cause data to be returned that never actually resided at that offset (negatively speaking) if the list is modified during the access (either before or after the modification). Is this an issue?

i += PyList_GET_SIZE(self);

Reproducer (it will happen eventually):

import re
import threading


def ins1(b, l):
    b.wait()
    l.insert(0, 'potato')

def get_secret(b, l):
    b.wait()
    assert l[-1] != 'super secret password'


def check(funcs, *args):
    barrier = threading.Barrier(len(funcs))
    thrds = []

    for func in funcs:
        thrd = threading.Thread(target=func, args=(barrier, *args))

        thrds.append(thrd)
        thrd.start()

    for thrd in thrds:
        thrd.join()


if __name__ == "__main__":
    while True:
        check([ins1] + [get_secret] * 10, ['super secret password', 'tomato'])

Output:

$ ./python ../check.py 
Exception in thread Thread-38474 (get_secret):
Traceback (most recent call last):
  File "/home/tom/work/cpython/free/cp/Lib/threading.py", line 1054, in _bootstrap_inner
    self.run()
    ~~~~~~~~^^
  File "/home/tom/work/cpython/free/cp/Lib/threading.py", line 996, in run
    self._target(*self._args, **self._kwargs)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/tom/work/cpython/free/cp/../check.py", line 11, in get_secret
    assert l[-1] != 'super secret password'
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError

CPython versions tested on:

3.14

Operating systems tested on:

Linux

@tom-pytel tom-pytel added the type-bug An unexpected behavior, bug, or error label Mar 1, 2025
@tom-pytel
Copy link
Contributor Author

ping @colesbury

@colesbury
Copy link
Contributor

We can document this, but I don't think we should change the implementation.

@tom-pytel tom-pytel closed this as not planned Won't fix, can't repro, duplicate, stale Mar 29, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
interpreter-core (Objects, Python, Grammar, and Parser dirs) topic-free-threading type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

No branches or pull requests

3 participants
0