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

时间:2012-05-04 03:03:16

标签: debugging ocaml

我在Ocaml中执行从int转换为int32的转换类型。我更改了String Ocaml的库(下面的代码)

的一些功能
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

请注意,当我运行代码时,我在代码中更改了许多地方int -> int32我收到了错误:

./xsd2coq < grammar/cpf.xsd > coq/cpf.v
Segmentation fault (core dumped)

在文件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;;

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

1 个答案:

答案 0 :(得分:7)

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

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