Skip to content

[v640][Python] Add regression test for the exit-time crash of issue #23728 - #23850

Draft
guitargeek wants to merge 2 commits into
root-project:v6-40-00-patchesfrom
guitargeek:v6-40-fix-23728-nofix
Draft

guitargeek wants to merge 2 commits into
root-project:v6-40-00-patchesfrom
guitargeek:v6-40-fix-23728-nofix

Conversation

@guitargeek

@guitargeek guitargeek commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

No description provided.

@guitargeek guitargeek self-assigned this Oct 27, 2026
@guitargeek guitargeek changed the title [pyroot] Add regression test for the exit-time crash of issue #23728 [640][pyroot] Add regression test for the exit-time crash of issue #23728 Oct 27, 2026
@guitargeek guitargeek changed the title [640][pyroot] Add regression test for the exit-time crash of issue #23728 [640][Python] Add regression test for the exit-time crash of issue #23728 Oct 27, 2026
@guitargeek
guitargeek force-pushed the v6-40-fix-23728-nofix branch from 81fbbb7 to 04f06df Compare October 27, 2026 10:18
@github-actions

github-actions Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

Test Results

    23 files      23 suites   3d 12h 11m 28s ⏱️
 3 878 tests  3 877 ✅ 0 💤  1 ❌
81 165 runs  81 144 ✅ 0 💤 21 ❌

For more details on these failures, see this check.

Results for commit 7b6b288.

♻️ This comment has been updated with latest results.

…oject#23728

Reads a tree with a branch of a dictionary-less collection in a fresh Python
process, lets TROOT::EndOfProcessCleanups delete it at exit, and constructs
another dictionary-less object before exiting. This crashed in the
JIT-compiled destructor lookup before the CppInterOp upgrade.

The child process runs with MALLOC_PERTURB_ set, because a use of destroyed
objects only crashes reliably when freed memory is poisoned, and with
ROOT_OBJECT_AUTO_REGISTRATION=1 plus explicit checks that the file is
registered with gROOT and owns the tree, so the test keeps exercising the
scenario when object auto-registration is disabled.

Assisted-by: claude-code:claude-fable-5-1
(cherry picked from commit a41307c)
@guitargeek
guitargeek force-pushed the v6-40-fix-23728-nofix branch from 04f06df to 7b6b288 Compare October 28, 2026 06:43
@guitargeek guitargeek changed the title [640][Python] Add regression test for the exit-time crash of issue #23728 [v640][Python] Add regression test for the exit-time crash of issue #23728 Oct 28, 2026
guitargeek added a commit to guitargeek/root that referenced this pull request Oct 28, 2026
…vely

The test left the destructor of the branch class uncompiled until exit,
so that cling had to JIT-compile it from TROOT::EndOfProcessCleanups().
On Windows, that cleanup runs from libCore's DLL_PROCESS_DETACH, after
libCling's statics have already been torn down, so compiling anything
there crashes with or without the fix (the no-fix run in root-project#23850 fails
identically). Pre-compile the exact destructor instead: the exit-time
call is then a pure cache lookup, which is the regular exit path on
Windows. The bug was in that lookup on the destroyed function-local
static, so the test still fails without the fix.

Write the branch through the overload taking the class name and the
address. The templated Branch() that the pythonization on master calls
refuses collections without a compiled CollectionProxy, which silently
left the tree without the branch and the test without its purpose.

Also give the child process a timeout: without the fix, ROOT's crash
handler can hang instead of terminating the process.

Assisted-by: claude-code:claude-fable-5-1
…vely

The test left the destructor of the branch class uncompiled until exit,
so that cling had to JIT-compile it from TROOT::EndOfProcessCleanups().
On Windows, that cleanup runs from libCore's DLL_PROCESS_DETACH, after
libCling's statics have already been torn down, so compiling anything
there crashes with or without the fix (the no-fix run in root-project#23850 fails
identically). Pre-compile the exact destructor instead: the exit-time
call is then a pure cache lookup, which is the regular exit path on
Windows. The bug was in that lookup on the destroyed function-local
static, so the test still fails without the fix.

Write the branch through the overload taking the class name and the
address. The templated Branch() that the pythonization on master calls
refuses collections without a compiled CollectionProxy, which silently
left the tree without the branch and the test without its purpose.

Also give the child process a timeout: without the fix, ROOT's crash
handler can hang instead of terminating the process.

Assisted-by: claude-code:claude-fable-5-1
guitargeek added a commit to guitargeek/root that referenced this pull request Oct 28, 2026
…vely

The test left the destructor of the branch class uncompiled until exit,
so that cling had to JIT-compile it from TROOT::EndOfProcessCleanups().
On Windows, that cleanup runs from libCore's DLL_PROCESS_DETACH, after
libCling's statics have already been torn down, so compiling anything
there crashes with or without the fix (the no-fix run in root-project#23850 fails
identically). Pre-compile the exact destructor instead: the exit-time
call is then a pure cache lookup, which is the regular exit path on
Windows. The bug was in that lookup on the destroyed function-local
static, so the test still fails without the fix.

Write the branch through the overload taking the class name and the
address. The templated Branch() that the pythonization on master calls
refuses collections without a compiled CollectionProxy, which silently
left the tree without the branch and the test without its purpose.

Also give the child process a timeout: without the fix, ROOT's crash
handler can hang instead of terminating the process.

Assisted-by: claude-code:claude-fable-5-1
guitargeek added a commit to guitargeek/root that referenced this pull request Oct 28, 2026
…vely

The test left the destructor of the branch class uncompiled until exit,
so that cling had to JIT-compile it from TROOT::EndOfProcessCleanups().
On Windows, that cleanup runs from libCore's DLL_PROCESS_DETACH, after
libCling's statics have already been torn down, so compiling anything
there crashes with or without the fix (the no-fix run in root-project#23850 fails
identically). Pre-compile the exact destructor instead: the exit-time
call is then a pure cache lookup, which is the regular exit path on
Windows. The bug was in that lookup on the destroyed function-local
static, so the test still fails without the fix.

Write the branch through the overload taking the class name and the
address. The templated Branch() that the pythonization on master calls
refuses collections without a compiled CollectionProxy, which silently
left the tree without the branch and the test without its purpose.

Also give the child process a timeout: without the fix, ROOT's crash
handler can hang instead of terminating the process.

Assisted-by: claude-code:claude-fable-5-1

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant