Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Segfault when using improperly defined struct #53754

Open
Octogonapus opened this issue Mar 15, 2024 · 6 comments
Open

Segfault when using improperly defined struct #53754

Octogonapus opened this issue Mar 15, 2024 · 6 comments
Assignees
Labels
kind:bug Indicates an unexpected problem or unintended behavior

Comments

@Octogonapus
Copy link
Sponsor Contributor

Octogonapus commented Mar 15, 2024

When defining a struct that uses a type that doesn't exist, you get an error but the struct is still somehow defined. Using it then causes a crash. I would expect the struct to not be defined at all, or at least using it to be an error not a crash.

julia> struct A
           x::Vector{B}
       end
ERROR: UndefVarError: `B` not defined
Stacktrace:
 [1] top-level scope
   @ REPL[1]:1

julia> A
A

julia> A[]

[2249686] signal (11.1): Segmentation fault
in expression starting at none:0
_julia_type_to_llvm at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/cgutils.cpp:648 [inlined]
_julia_type_to_llvm at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/cgutils.cpp:641
julia_type_to_llvm at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/cgutils.cpp:660 [inlined]
update_julia_type at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/codegen.cpp:2020 [inlined]
update_julia_type at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/codegen.cpp:1983
emit_expr at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/codegen.cpp:5517
emit_ssaval_assign at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/codegen.cpp:5101
emit_stmtpos at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/codegen.cpp:5335 [inlined]
emit_function at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/codegen.cpp:8380
jl_emit_code at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/codegen.cpp:8715
jl_emit_codeinst at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/codegen.cpp:8789
jl_compile_workqueue at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/codegen.cpp:8913
_jl_compile_codeinst at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/jitlayers.cpp:226
jl_generate_fptr_impl at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/jitlayers.cpp:518
jl_compile_method_internal at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2480 [inlined]
jl_compile_method_internal at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2368
_jl_invoke at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2886 [inlined]
ijl_apply_generic at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3076
#55 at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:273
jfptr_YY.55_91703.1 at /home/salmon/.julia/juliaup/julia-1.10.2+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3076
with_repl_linfo at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:569
jfptr_with_repl_linfo_91808.1 at /home/salmon/.julia/juliaup/julia-1.10.2+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3076
display at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:259
display at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:278 [inlined]
display at ./multimedia.jl:340
jfptr_display_64968.1 at /home/salmon/.julia/juliaup/julia-1.10.2+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3076
jl_apply at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
jl_f__call_latest at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/builtins.c:812
#invokelatest#2 at ./essentials.jl:892 [inlined]
invokelatest at ./essentials.jl:889 [inlined]
print_response at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:315
#57 at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:284
jfptr_YY.57_91733.1 at /home/salmon/.julia/juliaup/julia-1.10.2+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3076
with_repl_linfo at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:569
jfptr_with_repl_linfo_91808.1 at /home/salmon/.julia/juliaup/julia-1.10.2+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3076
print_response at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:282
do_respond at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:911
jfptr_do_respond_91881.1 at /home/salmon/.julia/juliaup/julia-1.10.2+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3076
jl_apply at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
jl_f__call_latest at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/builtins.c:812
#invokelatest#2 at ./essentials.jl:892 [inlined]
invokelatest at ./essentials.jl:889 [inlined]
run_interface at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/LineEdit.jl:2656
jfptr_run_interface_90635.1 at /home/salmon/.julia/juliaup/julia-1.10.2+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3076
run_frontend at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:1312
#62 at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/usr/share/julia/stdlib/v1.10/REPL/src/REPL.jl:386
jfptr_YY.62_91784.1 at /home/salmon/.julia/juliaup/julia-1.10.2+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
_jl_invoke at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:2894 [inlined]
ijl_apply_generic at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/gf.c:3076
jl_apply at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/julia.h:1982 [inlined]
start_task at /cache/build/builder-amdci5-1/julialang/julia-release-1-dot-10/src/task.c:1238
Allocations: 2708438 (Pool: 2705581; Big: 2857); GC: 4
[1]    2249686 segmentation fault  julia
julia> versioninfo()
Julia Version 1.10.2
Commit bd47eca2c8a (2024-03-01 10:14 UTC)
Build Info:
  Official https://julialang.org/ release
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 32 × 13th Gen Intel(R) Core(TM) i9-13900K
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-15.0.7 (ORCJIT, goldmont)
Threads: 1 default, 0 interactive, 1 GC (on 32 virtual cores)
Environment:
  LD_LIBRARY_PATH = /home/salmon/.gvm/pkgsets/go1.22/global/overlay/lib::/usr/local/cuda-12.1/lib64/
  DYLD_LIBRARY_PATH = /home/salmon/.gvm/pkgsets/go1.22/global/overlay/lib:
  JULIA_PKG_SERVER = 
  JULIA_EDITOR = code --wait
@gbaraldi
Copy link
Member

On master I don't get a segfault but I still get an internal error.

@JeffBezanson JeffBezanson self-assigned this Mar 20, 2024
@JeffBezanson
Copy link
Sponsor Member

Originally I wanted to only assign the global A when the type was complete, but that led to #36104. Since we can't unassign globals, it seems we're stuck with zombie types. Maybe an ok fix is to return all Union{} for the fieldtypes of such types?

@JeffBezanson JeffBezanson added the kind:bug Indicates an unexpected problem or unintended behavior label Mar 20, 2024
@Keno
Copy link
Member

Keno commented Mar 20, 2024

Time to revisit #32658?

@vtjnash
Copy link
Sponsor Member

vtjnash commented Mar 20, 2024

I think if we could fix dispatch with malformed types to go to the kind instead, we could treat these as malformed types which have inference disabled on them (instead of as concrete types) until the fields get populated? I am still not exactly sure of the details of that though.

Is there some part of #32658 we should try to merge and backport now?

@JeffBezanson
Copy link
Sponsor Member

The easier version of this is to just never populate the field types, and you have to reload the module and try again.

@aviatesk
Copy link
Sponsor Member

Currently, these cases do indeed cause a segfault, so how about adjusting some critical functions to avoid a segfault and at least keep the session alive?
This might result in incomplete inference, and performance might not be optimal even after populating the fields, but reloading the module can refresh the inference anyway. Otherwise we would need a more complex invalidation system (although it sounds too heavy-handled to introduce just for this issue).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kind:bug Indicates an unexpected problem or unintended behavior
Projects
None yet
Development

No branches or pull requests

6 participants