`deepcopy(::PyObject)` can yield segfault
- 主要言語
- Julia
- スター
- 1.5k
- フォーク
- 186
- PR マージ指標
- 30日以内にマージされた PR はありません
説明
I think we need to overload `deepcopy_internal(::PyObject, ...)` and increment the refcount in it?
```julia
julia> using PyCall
julia> a = pycall(pyimport("numpy").zeros, PyObject, 10000)
PyObject array([0., 0., 0., ..., 0., 0., 0.])
julia> pycall(pyimport("sys").getrefcount, Int, a)
2
julia> b = deepcopy(a)
PyObject array([0., 0., 0., ..., 0., 0., 0.])
julia> pycall(pyimport("sys").getrefcount, Int, a)
2
julia> pycall(pyimport("sys").getrefcount, Int, b) # creating b did not incref
2
julia> pycall(pyimport("builtins").id, Int, a)
140671027744560
julia> pycall(pyimport("builtins").id, Int, b) # just to show that b _is_ the same Python object
140671027744560
julia> a = nothing
julia> GC.gc(); GC.gc(); GC.gc(); GC.gc(); GC.gc(); GC.gc(); GC.gc()
julia> pycall(pyimport("builtins").id, Int, b)
140671027744560
julia> pycall(pyimport("sys").getrefcount, Int, b) # now `PyPtr(b)` is pointing nowhere
140671027744561
julia> b # sometime segfault doesn't happen immediately
PyObject ''uiltin_function_or_method'
julia> pyimport("gc").collect()
signal (11): Segmentation fault
in expression starting at REPL[14]:1
pymalloc_alloc at /tmp/python-build.20200119182925.141496/Python-3.7.6/Objects/obmalloc.c:1420 [inlined]
pymalloc_alloc at /tmp/python-build.20200119182925.141496/Python-3.7.6/Objects/obmalloc.c:1386 [inlined]
_PyObject_Malloc at /tmp/python-build.20200119182925.141496/Python-3.7.6/Objects/obmalloc.c:1578
_PyObject_GC_Alloc at /tmp/python-build.20200119182925.141496/Python-3.7.6/Modules/gcmodule.c:1693 [inlined]
_PyObject_GC_Malloc at /tmp/python-build.20200119182925.141496/Python-3.7.6/Modules/gcmodule.c:1715
_PyObject_GC_New at /tmp/python-build.20200119182925.141496/Python-3.7.6/Modules/gcmodule.c:1727
```
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
調査の方向性
Reproduce the failure with the Julia/PyCall and Python REPL sequence in the issue, then inspect the deepcopy_internal(::PyObject, ...) path and PyObject reference-count handling. Verify that deepcopy keeps the Python object alive after the original is released and garbage collection runs without a segmentation fault.
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- api
- issue の種類
- バグ
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 35/100