我正在使用Haskell创建一些Z3公式。当我尝试运行以下代码时,我得到了分段错误(尽管我做的其他示例工作得很好)。有人知道这是Z3中的错误吗? Haskell中使用的API是C API名称的镜像:
fitElement.origin.corners = vector5;
fitElement.destination = fitElement.origin;
答案 0 :(得分:3)
这是我们图书馆的一个错误。在4.0.0中我们引入了自动内存管理,但我们错过了与错误处理的交互。似乎内存管理代码在错误处理代码之前执行。因此,当mkBVmul
返回时,内存管理代码会尝试增加结果对象的引用计数,在库知道存在错误之前,该引用计数将变为 null 。
我为此创建了一个问题(参见https://bitbucket.org/iago/z3-haskell/issues/5/segmentation-fault-due-to-type-error),我将尽快解决它。但我们非常感谢您将来向我们报告细分错误。今天我们不会在工作中使用这个库,所以,即使我确实维护它,我也会尝试帮助任何想要贡献的人,我主要依靠用户报告错误并提供补丁。
话虽这么说,一旦修复了错误,你将得到的是带有错误代码 Z3_SORT_ERROR 的Haskell异常。 z3-haskell 绑定提供很少类型安全的事实是一个设计决策。编写类型安全的Z3 API并不重要,需要相当多的类型hackery和一些GHC扩展。我们的目标用户是使用Z3作为后端的工具编写者。他们中的大多数人不想自己处理编组和内存管理,但仍希望低级访问Z3的API。
我们不希望人们使用我们的绑定直接编写SMT问题, sbv 更适合这种情况。当然可以为 z3-haskell 创建一个类型安全的包装器,作为一个单独的包。我在我的待办事项列表中有这个,我只是没有找到时间。
答案 1 :(得分:1)
你应该向Haskell Z3软件包维护者报告这个问题;因为他们应该首先保护这种用法。您可以在http://hackage.haskell.org/package/z3
上找到他们的联系信息