Skip to content

Segfault on x86_64 platforms related to passing Vector through ccall #57374

@BioTurboNick

Description

@BioTurboNick

From here: JuliaLang/LinearAlgebra.jl#1190

There appears to be a platform-specific issue where, in certain cases, initiating a vector and then resizing or reshaping it can result in a segfault (Linux) or EXCEPTION_ACCESS_VIOLATION or ReadOnlyMemoryError (Windows). Error is sometimes sporadic.

Only seems to affect x86_64 and (at least) Julia 1.9 through nightly. Does not seem to affect Linux i686 or MacOS-aarch64 (on at least nightly).

Broken (in the larger context of the stegr! method):

# A::Matrix{T <: AbstractFloat}
Z = similar(A, T, n * m)
# ...
return reshape(resize!(Z, n * m), n, m)

Works:

# A::Matrix{T <: AbstractFloat}
Z = similar(A, T, n, m)
# ...
return reshape(resize!(vec(Z), n * m), n, m)

Can execute this on nightly to reproduce:

        const elty = Float64
        using LinearAlgebra
        import LinearAlgebra:LAPACK
        import Base: require_one_based_indexing
        import LinearAlgebra.LAPACK: @chkvalidparam, chklapackerror, @blasfunc
        import LinearAlgebra: chkstride1, BlasInt, libblastrampoline
        function LAPACK.stegr!(jobz::AbstractChar, range::AbstractChar, dv::AbstractVector{elty}, ev::AbstractVector{elty}, vl::Real, vu::Real, il::Integer, iu::Integer)
            require_one_based_indexing(dv, ev)
            chkstride1(dv, ev)
            n = length(dv)
            ne = length(ev)
            if ne == n - 1
                eev = [ev; zero(elty)]
            elseif ne == n
                eev = copy(ev)
                eev[n] = zero(elty)
            else
                throw(DimensionMismatch(lazy"ev has length $ne but needs one less than or equal to dv's length, $n)"))
            end

            abstol = Vector{elty}(undef, 1)
            m = Ref{BlasInt}()
            w = similar(dv, elty, n)
            ldz = jobz == 'N' ? 1 : n
            Zn = range == 'I' ? iu-il+1 : n
            Z = similar(dv, elty, ldz * Zn)
            isuppz = similar(dv, BlasInt, 2*size(Z, 2))
            work = Vector{elty}(undef, 1)
            lwork = BlasInt(-1)
            iwork = Vector{BlasInt}(undef, 1)
            liwork = BlasInt(-1)
            info = Ref{BlasInt}()
            for i = 1:2  # first call returns lwork as work[1] and liwork as iwork[1]
                ccall((@blasfunc(dstegr_), libblastrampoline), Cvoid,
                    (Ref{UInt8}, Ref{UInt8}, Ref{BlasInt}, Ptr{elty},
                    Ptr{elty}, Ref{elty}, Ref{elty}, Ref{BlasInt},
                    Ref{BlasInt}, Ptr{elty}, Ptr{BlasInt}, Ptr{elty},
                    Ptr{elty}, Ref{BlasInt}, Ptr{BlasInt}, Ptr{elty},
                    Ref{BlasInt}, Ptr{BlasInt}, Ref{BlasInt}, Ptr{BlasInt},
                    Clong, Clong),
                    jobz, range, n, dv,
                    eev, vl, vu, il,
                    iu, abstol, m, w,
                    Z, ldz, isuppz, work,
                    lwork, iwork, liwork, info,
                    1, 1)
                chklapackerror(info[])
                if i == 1
                    lwork = BlasInt(work[1])
                    resize!(work, lwork)
                    liwork = iwork[1]
                    resize!(iwork, liwork)
                end
            end
            wm = min(n, m[])
            Zm = min(Zn, m[])
            resize!(w, wm), reshape(resize!(Z, ldz * Zm), ldz, Zm)
        end
a = SymTridiagonal([1.0129540363709792, 0.5125544740879742, 1.4404024510136622, 0.9645500736079791, 0.8349894041911953, 1.0404785847552251, 0.9418430974856163, 0.1401583600348122, 0.38426770335791244, 0.4551768643291618, 0.4200328536585094, 1.8593998829530265e-7], [0.40739613651353346, 0.10643163002740841, 0.6222058356713083, 0.33352809216796453, 0.3799591152214755, 0.21073828255014115, 0.8158852900425236, 0.1683998539581063, 0.5002702262460241, 0.6123852845929411, 0.7701699043551441])
A = copy(a); LAPACK.stegr!('V', 'A', A.dv, A.ev, 0.0, 0.0, 0, 0)

Metadata

Metadata

Assignees

No one assigned

    Labels

    arrays[a, r, r, a, y, s]bugIndicates an unexpected problem or unintended behaviorrr trace includedsystem:x86

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions