【问题标题】:Z3's OCaml library throws segmentation faultZ3 的 OCaml 库引发分段错误
【发布时间】:2023-03-27 15:42:01
【问题描述】:

考虑以下使用 Z3 模块与 Z3 求解器交互的 OCaml 代码 sn-p。代码尝试在 Z3 中使用一个接受两个整数参数的构造函数 T 定义一个新的 TPair 数据类型:

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 的调用都会引发分段错误。可能是什么原因?

【问题讨论】:

  • 报告给图书馆作者。
  • 这里给出的示例源代码可以编译(带有警告)并且对我来说运行良好。 OCaml 有点古怪。你能告诉我们你正在使用哪个版本以及你从哪里得到的吗?此外,请确保您使用的是最新的 Z3 源代码并从源代码编译它,因为自上一个二进制版本以来已经进行了许多修复。

标签: ocaml z3


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。这个问题是针对 Z3 社区的,所以我删除了 OCaml 标签。你有什么理由重新添加它?
  • 当然,问题在标题和正文中都明确说明了 OCaml,它还包括 OCaml 代码。看起来 OP 也认为 OCaml 或他的代码中的问题,而不是库中的问题。所以,我的任务是解释,OCaml 本身不能成为这些问题的原因,所以问题的根源应该在别处寻找。我希望,将来我的回答将帮助那些将搜索 "segmentation fault + ocaml" 的人,明确地说,问题不能出在 OCaml 代码中。
猜你喜欢
  • 2015-09-26
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多