DataStructures.jl
DataStructures.jl copied to clipboard
SIGSEGV CircularBuffer push!
Pushing into a 0 sized CircularBuffer crashes as shown in below snippet.
The expected behavior would be not failing and just not pushing the value into the buffer.
julia> using DataStructures
julia> v = CircularBuffer(0)
0-element CircularBuffer{Any}
julia> push!(v, 23)
signal (11): Segmentation fault
in expression starting at none:0
jl_field_offset at /buildworker/worker/package_linux64/build/src/julia.h:1103 [inlined]
set_nth_field at /buildworker/worker/package_linux64/build/src/datatype.c:1469
jl_f_tuple at /buildworker/worker/package_linux64/build/src/builtins.c:793
indexed_iterate at ./pair.jl:37 [inlined]
indexed_iterate at ./pair.jl:37
jfptr_indexed_iterate_21685.clone_1 at /opt/julia-1.7.0-rc2/lib/julia/sys.so (unknown line)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
print_response at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:281
#45 at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:275
jfptr_YY.45_47223.clone_1 at /opt/julia-1.7.0-rc2/lib/julia/sys.so (unknown line)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
with_repl_linfo at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:508
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
print_response at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:273
do_respond at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:844
jfptr_do_respond_48645.clone_1 at /opt/julia-1.7.0-rc2/lib/julia/sys.so (unknown line)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1790 [inlined]
jl_f__call_latest at /buildworker/worker/package_linux64/build/src/builtins.c:757
#invokelatest#2 at ./essentials.jl:716 [inlined]
invokelatest at ./essentials.jl:714 [inlined]
run_interface at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.7/REPL/src/LineEdit.jl:2493
jfptr_run_interface_47841.clone_1 at /opt/julia-1.7.0-rc2/lib/julia/sys.so (unknown line)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
run_frontend at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:1230
#49 at ./task.jl:411
jfptr_YY.49_48533.clone_1 at /opt/julia-1.7.0-rc2/lib/julia/sys.so (unknown line)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1790 [inlined]
start_task at /buildworker/worker/package_linux64/build/src/task.c:875
Allocations: 2720 (Pool: 2712; Big: 8); GC: 0
Segmentation fault
The reason for the strange error is due to faulty @inbounds
usage.
julia> push!(v, 23)
ERROR: BoundsError: attempt to access 0-element Vector{Any} at index [1]
Stacktrace:
[1] setindex!
@ ./essentials.jl:458 [inlined]
[2] push!(cb::CircularBuffer{Any}, data::Int64)
@ DataStructures ~/.julia/packages/DataStructures/nBjdy/src/circular_buffer.jl:90
[3] top-level scope
@ REPL[3]:1
On master a 0-capacity CircularBuffer can't be created:
julia> CircularBuffer(0)
ERROR: ArgumentError: Value of 'first' must be inbounds of buffer
Stacktrace:
[1] CircularBuffer
@ ~/.julia/dev/DataStructures/src/circular_buffer.jl:18 [inlined]
[2] CircularBuffer{Any}(iter::Vector{Any}, capacity::Int64)
@ DataStructures ~/.julia/dev/DataStructures/src/circular_buffer.jl:26
[3] CircularBuffer
@ ~/.julia/dev/DataStructures/src/circular_buffer.jl:31 [inlined]
[4] CircularBuffer(capacity::Int64)
@ DataStructures ~/.julia/dev/DataStructures/src/circular_buffer.jl:29
[5] top-level scope
@ REPL[14]:1
So technically this can be closed. A better error message would still be helpful.
Closing since the error does no apply anymore to current release