gh-128421: Avoid TSAN warnings in sys._current_frames() (gh-131548)

This tells TSAN not to sanitize `PyUnstable_InterpreterFrame_GetLine()`.
There's a possible data race on the access to the frame's `instr_ptr`
if the frame is currently executing. We don't really care about the
race. In theory, we could use relaxed atomics for every access to
`instr_ptr`, but that would create more code churn and current compilers
are overly conservative with optimizations around relaxed atomic
accesses.

We also don't sanitize `_PyFrame_IsIncomplete()` because it accesses
`instr_ptr` and is called from assertions within PyFrame_GetCode().
This commit is contained in:
Sam Gross 2025-03-24 09:49:39 -04:00 committed by GitHub
parent 4596666a9f
commit da6730caa5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 25 additions and 36 deletions

View file

@ -139,7 +139,9 @@ PyUnstable_InterpreterFrame_GetLasti(struct _PyInterpreterFrame *frame)
return _PyInterpreterFrame_LASTI(frame) * sizeof(_Py_CODEUNIT);
}
int
// NOTE: We allow racy accesses to the instruction pointer from other threads
// for sys._current_frames() and similar APIs.
int _Py_NO_SANITIZE_THREAD
PyUnstable_InterpreterFrame_GetLine(_PyInterpreterFrame *frame)
{
int addr = _PyInterpreterFrame_LASTI(frame) * sizeof(_Py_CODEUNIT);