malloc/segmentation error with ccall


#1

I have interchangeably two errors (either malloc error or segmentation fault) when using ccall to call a C function.

The C function is from the CPLEX C callable library:

CPXLIBAPI
int CPXPUBLIC
   CPXcallbackpostheursoln (CPXCALLBACKCONTEXTptr context, int cnt,
                            int const *ind, double const *val,
                            double obj,
                            CPXCALLBACKSOLUTIONSTRATEGY strat);

My ccall function:

function cbpostheursoln(env::Env,context_::Ptr{Void},cnt::Cint,ind::Vector{Cint},val::Vector{Cdouble},obj::Cdouble,strat::CbSolStrat)
    stat=@cpx_ccall(callbackpostheursoln,Cint,(
    Ptr{Void},
    Cint,
    Ptr{Cint},
    Ptr{Cdouble},
    Cdouble,
    Cint
    ),
    context_,cnt,ind,val,obj,strat)

    println("cbpostheursoln status $stat")

    if stat!=0
        throw(CplexError(env,stat))
    end
    return stat
end

For the errors, I get either of the following two errors:

julia(28377,0x7fffb95f83c0) malloc: *** error for object 0x7fe66b6cfb10: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug

OR

signal (11): Segmentation fault: 11

I think candidate bugs are (1) Julia does not convert variable val::Vector{Cdouble} to double const * val correctly; (2) some variables are gabage collected unexpectedly.

For the full code, please check this PR: https://github.com/JuliaOpt/CPLEX.jl/pull/198. To run it, one needs IBM CPLEX v12.8.0 or above.

I have been working on this bug for several hours since last week. I will try to debug with gdb next and will post here if there is new development.

Version information:

Julia Version 0.6.0
Commit 903644385b (2017-06-19 13:05 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin13.4.0)
  CPU: Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
  WORD_SIZE: 64
  BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Haswell)
  LAPACK: libopenblas64_
  LIBM: libopenlibm
  LLVM: libLLVM-3.9.1 (ORCJIT, broadwell)

Please don’t judge the Julia version:)