Библиотека OCaml Z3 выдает ошибку сегментации

#ocaml #z3

#ocaml #z3

Вопрос:

Рассмотрим следующий фрагмент кода OCaml, который использует модуль Z3 для взаимодействия с решателем Z3. Код пытается определить новый TPair тип данных в Z3 с помощью одного конструктора 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_decl и get_accessor_decls оба вызывают ошибку сегментации. В чем может быть причина?

Комментарии:

1. Сообщите об этом автору библиотеки.

2. Приведенный здесь пример исходного кода компилируется (с предупреждениями) и работает нормально для меня. OCaml немного неустойчив. Не могли бы вы рассказать нам, какую именно версию вы используете и откуда вы это взяли? Кроме того, убедитесь, что вы используете последний исходный код Z3, и скомпилируйте его из исходного кода, поскольку с момента последнего двоичного выпуска было исправлено несколько исправлений.

Ответ №1:

Никакой код, написанный на чистом OCaml, не может вызвать ошибку сегментации. Это потому, что OCaml является языком, безопасным для памяти. Проблема где-то в системе, либо в том месте, где OCaml привязан к базовой библиотеке, либо в самой библиотеке z3.

Только авторы библиотек (или привязок) могут помочь вам в отладке и устранении этой проблемы. Поэтому, пожалуйста, создайте проблему в вышестоящем репозитории.

Комментарии:

1. Спасибо за ответ. Вопрос предназначен для сообщества Z3, поэтому я удалил тег OCaml. По какой-либо причине вы повторно добавили ее?

2. Конечно, в вопросе явно указан OCaml как в заголовке, так и в теле, он также включал код OCaml. Также похоже, что OP думает, что проблема в OCaml или в его коде, а не в библиотеке. Итак, моя задача состояла в том, чтобы объяснить, что OCaml сам по себе не может быть причиной таких проблем, поэтому корень проблемы следует искать в другом месте. Я надеюсь, что в будущем мой ответ поможет кому-то, кто будет искать «ошибка сегментации ocaml», явно указав, что проблема не может быть в коде OCaml.