Z3的OCaml库引发了分段错误

时间:2016-10-06 22:42:04

标签: ocaml z3

考虑以下OCaml代码片段,该代码片段使用Z3模块与Z3解算器连接。代码尝试在Z3中使用单个构造函数TPair定义新的T数据类型,该构造函数接受两个整数参数:

open Z3                                                                                         
open Z3.SMT
open Z3.Expr                                                                                    
open Z3.Symbol                                                                                  
open Z3.Datatype                                                                                
open Z3.FuncDecl
open Z3.Arithmetic 
open Z3.Arithmetic.Integer                                                                      
open Z3.Quantifier

let _ =                                                                                         
  let cfg = [("model", "true"); ("proof", "false")] in
  let ctx = (mk_context cfg) in 
  let sym = Symbol.mk_string ctx in
  let s_Int = mk_sort ctx in
  (* (declare-datatypes () ((TPair (T Int Int) )))*)
  let s_T = mk_constructor_s ctx "T" (sym "isT") 
               [sym "left"; sym "right"]                                                        
               [Some s_Int; Some s_Int] [0; 0] in                                               
  let s_TPair = mk_sort_s ctx "TPair" [s_T] in
  let _::s_content::_ = Constructor.get_accessor_decls s_T in                                   
  let s_isT = Constructor.get_tester_decl s_T in                                                
  let solver = Solver.mk_solver ctx None in
    begin 
      Printf.printf "*****  CONTEXT ******\n";                                                  
      print_string @@ Solver.to_string solver;
      Printf.printf "\n*********************\n"
    end 

get_tester_declget_accessor_decls的调用都会导致分段错误。可能是什么原因?

1 个答案:

答案 0 :(得分:1)

用纯OCaml编写的代码不会导致分段错误。这是因为OCaml是一种内存安全语言。问题出在管道中的某个地方,无论是在OCaml绑定到底层库的地方,还是在z3库本身。

只有库(或绑定)作者可以帮助您调试和解决此问题。所以,请在the upstream存储库中创建一个问题。

相关问题