将类型int更改为ocaml中的int32时的分段错误(核心转储)

Quy*_*yen 0 debugging ocaml

我在int进入Ocaml的转换类型int32.我更改了StringOcaml库的一些功能(下面的代码)

external length : string -> int32 = "%string_length"
external create: int32 -> string = "caml_create_string"
external unsafe_blit : string -> int32 -> string -> int32 -> int32 -> unit
  = "caml_blit_string" "noalloc"

let sub s ofs len =
  if ofs < 0l or len < 0l or add ofs len > length s
  then invalid_arg "String.sub"
  else begin
    let r = create len in
    unsafe_blit s ofs r 0l len;
    r
  end
Run Code Online (Sandbox Code Playgroud)

请注意,我在int -> int32运行代码时更改了代码中的很多位置我收到了错误:

./xsd2coq < grammar/cpf.xsd > coq/cpf.v
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

在文件中xsd2coq.ml我有一个缓冲区是:

let main () =

  let xml = parse_xml stdin in
  let xsds = Xsd_of_xml.xsd_of_xml xml in

  let b = Buffer.create 10000 in

  Coq_of_xsd.genr_ml b xsds;
  Buffer.output_buffer stdout b;;

let _ = run main;;
Run Code Online (Sandbox Code Playgroud)

我想了解产生关于分段错误的错误的原因是什么?能不能给我任何提示或建议来调试我的代码?谢谢

Jef*_*eld 7

"%string_length"是OCaml原语.您只能通过更改OCaml代码来更改其返回类型.您还必须更改OCaml运行时中的代码.如果OCaml尝试将int值(从运行时获得的int32值)视为值,它将崩溃.的int32值是要由装箱值(指针)来表示,而是一个int值是一个立即值.

做你想做的事情要做很多工作.由于字符串的长度非常有限(至少在32位架构中),我不确定它会特别有用.