2012-05-04 25 views
0

intからint32にOcamlの変換タイプを実行しています。ocamlでタイプintをint32に変更する際のセグメンテーションフォルト(コアダンプ)

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

で:私はString OCamlでのライブラリ私は私のコードは、私はエラーを得た実行したときに、私はint -> int32から私のコードに多くの場所を変更(以下コード)

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 

ノートのいくつかの機能を変更しましたファイル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;; 

私はsegmentatioに関するエラーが生じる理由が何であるかを理解したいと思います不具合?私のコードをデバッグするためのヒントや提案をお願いします。ありがとうございました

+1

この質問の今後の読者のメモ:なぜOCaml-Cインターフェイスで 'int'から' int32'に変更するとセグメンテーションフォールトが発生するのか、なぜ 'external'キーワードを使用する準備ができていないのか尋ねる必要がある場合。 –

答えて

7

"%string_length"はOCamlプリミティブです。 OCamlコードを変更するだけで、戻り値の型を変更することはできません。また、OCamlランタイムのコードを変更する必要があります。 OCamlがintの値(ランタイムから取得したもの)をint32の値として扱うと、クラッシュします。 int32の値はボックス化された値(ポインタ)で表されますが、intの値は即値です。

あなたがしようとしていることをやることはたくさんの仕事になります。文字列の長さは(少なくとも32ビットアーキテクチャでは)かなり限られているので、特に有用であるかどうかはわかりません。

+0

ありがとうございます。それは私が問題を理解するのを助けました。 – Quyen

+0

私の喜び!よろしく、 –

関連する問題