metaopt / optree

OpTree: Optimized PyTree Utilities
https://optree.readthedocs.io
Apache License 2.0
146 stars 7 forks source link

fix(treespec): fix potential segmentation fault when modifying `treespec.entries()` #116

Closed XuehaiPan closed 10 months ago

XuehaiPan commented 10 months ago

Description

Describe your changes in detail.

Always make a copy of the dict key list. This fixes a potential segmentation fault when users modify treespec.entries().

In [1]: import optree

In [2]: spec = optree.tree_structure({'a': 1, 'b': 2})

In [3]: spec
Out[3]: PyTreeSpec({'a': *, 'b': *})

In [4]: spec.entries().clear()

In [5]: optree.tree_unflatten(spec, range(spec.num_leaves))
[1]    39564 segmentation fault  ipython

Motivation and Context

Why is this change required? What problem does it solve? If it fixes an open issue, please link to the issue here. You can use the syntax close #15213 if this solves the issue #15213

Types of changes

What types of changes does your code introduce? Put an x in all the boxes that apply:

Checklist

Go over all the following points, and put an x in all the boxes that apply. If you are unsure about any of these, don't hesitate to ask. We are here to help!

codecov[bot] commented 10 months ago

Codecov Report

All modified and coverable lines are covered by tests :white_check_mark:

Comparison is base (ec5eaf0) 100.00% compared to head (12272df) 100.00%.

Additional details and impacted files ```diff @@ Coverage Diff @@ ## main #116 +/- ## ========================================= Coverage 100.00% 100.00% ========================================= Files 8 8 Lines 708 708 ========================================= Hits 708 708 ``` | [Flag](https://app.codecov.io/gh/metaopt/optree/pull/116/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=metaopt) | Coverage Δ | | |---|---|---| | [unittests](https://app.codecov.io/gh/metaopt/optree/pull/116/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=metaopt) | `100.00% <ø> (ø)` | | Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=metaopt#carryforward-flags-in-the-pull-request-comment) to find out more.

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.