Java Z3使用JNA引发无效内存访问

Java Z3使用JNA引发无效内存访问,java,c,java-native-interface,jna,z3,Java,C,Java Native Interface,Jna,Z3,我在java中与jna一起使用Z3CAPI。我经常得到无效的内存访问,但仅限于windows(.dll)和mac os(.dylib)库。当我使用linux版本(.so)时不会发生这种情况 我暂时解决了这个问题,没有为ast和所有其他对象调用dec\u ref过程(我仍然调用inc\u refprocs,并且在开始时使用mk\u context\u rc)。当然,这种解决方案是不可持续的 我想这是由于某个地方的内存管理。即使我只是使用mk_上下文它仍然崩溃 在线程中,用户遇到了类似的问题,结果证

我在java中与jna一起使用Z3CAPI。我经常得到无效的内存访问,但仅限于windows(.dll)和mac os(.dylib)库。当我使用linux版本(.so)时不会发生这种情况

我暂时解决了这个问题,没有为ast和所有其他对象调用
dec\u ref
过程(我仍然调用
inc\u ref
procs,并且在开始时使用
mk\u context\u rc
)。当然,这种解决方案是不可持续的

我想这是由于某个地方的内存管理。即使我只是使用
mk_上下文
它仍然崩溃

在线程中,用户遇到了类似的问题,结果证明这是由于某些编译配置造成的

这是我得到的例外(在Mac OS X 10.6.8上)

这就是失败的痕迹

    Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
0   libz3.dylib                     0x00000001250d4d64 unsigned int ast_array_hash<expr>(expr* const*, unsigned int, unsigned int) + 244
1   libz3.dylib                     0x00000001250cb16a ast_manager::register_node_core(ast*) + 36
2   libz3.dylib                     0x00000001250cbeae ast_manager::mk_app_core(func_decl*, unsigned int, expr* const*) + 134
3   libz3.dylib                     0x00000001250cc30d ast_manager::mk_app(func_decl*, unsigned int, expr* const*) + 749
4   libz3.dylib                     0x000000012528c194 map_proc::reconstruct(app*) + 214
5   libz3.dylib                     0x00000001254830b8 void for_each_expr_core<qe::lift_foreign_vars, obj_mark<expr, bit_vector, default_t2uint<expr> >, false, false>(qe::lift_foreign_vars&, obj_mark<expr, bit_vector, default_t2uint<expr> >&, expr*) + 760
6   libz3.dylib                     0x00000001254832c9 qe::lift_foreign_vars::lift(obj_ref<expr, ast_manager>&) + 61
7   libz3.dylib                     0x00000001254833a6 qe::datatype_plugin::simplify(obj_ref<expr, ast_manager>&) + 92
8   libz3.dylib                     0x000000012546b1a7 qe::quant_elim_plugin::check(unsigned int, app* const*, expr*, obj_ref<expr, ast_manager>&, bool, ref_vector<app, ast_manager>&, qe::def_vector*) + 535
9   libz3.dylib                     0x000000012546b8f9 qe::quant_elim_new::eliminate_block(unsigned int, app* const*, obj_ref<expr, ast_manager>&, ref_vector<app, ast_manager>&, bool, qe::def_vector*) + 445
10  libz3.dylib                     0x000000012545f2cb qe::quant_elim_new::eliminate_exists(unsigned int, app* const*, obj_ref<expr, ast_manager>&, ref_vector<app, ast_manager>&, bool, qe::def_vector*) + 67
11  libz3.dylib                     0x0000000125462170 qe::quant_elim_new::eliminate_exists_bind(unsigned int, app* const*, obj_ref<expr, ast_manager>&) + 88
12  libz3.dylib                     0x000000012545c0ba qe::expr_quant_elim::elim(obj_ref<expr, ast_manager>&) + 1012
13  libz3.dylib                     0x000000012545cb75 qe::expr_quant_elim::operator()(expr*, expr*, obj_ref<expr, ast_manager>&) + 113
14  libz3.dylib                     0x000000012548b993 qe_tactic::imp::operator()(ref<goal> const&, sref_buffer<goal>&, ref<model_converter>&, ref<proof_converter>&, obj_ref<dependency_manager<ast_manager::expr_dependency_config>::dependency, ast_manager>&) + 783
15  libz3.dylib                     0x00000001255debfa cleanup_tactical::operator()(ref<goal> const&, sref_buffer<goal>&, ref<model_converter>&, ref<proof_converter>&, obj_ref<dependency_manager<ast_manager::expr_dependency_config>::dependency, ast_manager>&) + 14
16  libz3.dylib                     0x00000001255d5e3d exec(tactic&, ref<goal> const&, sref_buffer<goal>&, ref<model_converter>&, ref<proof_converter>&, obj_ref<dependency_manager<ast_manager::expr_dependency_config>::dependency, ast_manager>&) + 109
17  libz3.dylib                     0x0000000125070ed8 _tactic_apply + 680
18  libz3.dylib                     0x00000001250711d9 Z3_tactic_apply + 105
19  jna4404318687023840668.tmp      0x000000010a00cd1c ffi_call_unix64 + 76
20  jna4404318687023840668.tmp      0x000000010a00c884 ffi_call + 644
21  jna4404318687023840668.tmp      0x000000010a003ca5 Java_com_sun_jna_Native_ffi_1prep_1cif + 1605
22  jna4404318687023840668.tmp      0x000000010a004282 Java_com_sun_jna_Native_invokePointer + 34
23  ???                             0x00000001031cfd2e 0 + 4347198766
24  ???                             0x00000001031cd658 0 + 4347188824
25  ???                             0xffb89c44ff5c4272 0 + 18426649695542329970
线程0崩溃:调度队列:com.apple.main-Thread
0 libz3.dylib 0x00000001250d4d64无符号整数ast_数组_散列(expr*const*,无符号整数,无符号整数)+244
1 libz3.dylib 0x00000001250cb16a ast_管理器::寄存器节点核心(ast*)+36
2 libz3.dylib 0x00000001250cbeae ast_manager::mk_app_核心(func_decl*,unsigned int,expr*const*)+134
3 libz3.dylib 0x00000001250cc30d ast_管理器::mk_应用程序(func_decl*,无符号整数,expr*常量*)+749
4 libz3.dylib 0x000000012528c194映射程序::重构(应用*)+214
5 libz3.dylib 0x00000001254830b8每个expr核心无效(qe::提升外部变量和obj标记和expr*)+760
6 libz3.dylib 0x00000001254832c9 qe::lift_-foreign_-vars::lift(obj_-ref&)+61
7 libz3.dylib 0x00000001254833a6 qe::datatype_插件::simplify(obj_ref&)+92
8 libz3.dylib 0x000000012546b1a7 qe::quant_elim_插件::检查(无符号int、app*const*、expr*、obj_ref&、bool、ref_vector&、qe::def_vector*)+535
9 libz3.dylib 0x000000012546b8f9 qe::quant_elim_new::Elime_块(无符号整数,app*const*,obj_ref&,ref_vector&,bool,qe::def_vector*)+445
10 libz3.dylib 0x000000012545f2cb qe::quant_elim_new::elim_exists(无符号整数,app*const*,obj_ref&,ref_vector&,bool,qe::def_vector*)+67
11 libz3.dylib 0x0000000125462170 qe::quant_elim_new::Elime_exists_bind(无符号整数,app*const*,obj_ref&)+88
12 libz3.dylib 0x000000012545c0ba qe::expr\u quant\u elim::elim(obj\u ref&)+1012
13 libz3.dylib 0x000000012545cb75 qe::expr_quant_elim::operator()(expr*,expr*,obj_ref&)+113
14 libz3.dylib 0x000000012548b993 qe_策略::imp::operator()(ref const&,sref_buffer&,ref&,ref&,obj_ref&)+783
15 libz3.dylib 0x00000001255debfa cleanup_tactical::operator()(ref const&,sref_buffer&,ref&,ref&,obj_ref&)+14
16 libz3.dylib 0x00000001255d5e3d执行器(策略和,参考常数和,sref缓冲区和,参考和,参考和,目标参考和)+109
17 libz3.dylib 0x0000000125070ed8_策略_应用+680
18 libz3.dylib 0x00000001250711d9 Z3_策略_应用+105
19 jna4404318687023840668.tmp 0x000000010a00cd1c ffi_call_unix64+76
20 jna4404318687023840668.tmp 0x000000010a00c884外国金融机构电话+644
21 jna4404318687023840668.tmp 0x000000010a003ca5 Java_com_sun_jna_Native_ffi_1prep_1cif+1605
22 jna4404318687023840668.tmp 0x000000010a004282 Java_com_sun_jna_Native_invokeInter+34
23  ???                             0x00000001031cfd2e 0+4347198766
24  ???                             0x00000001031cd658 0+4347188824
25  ???                             0xffb89c44ff5c4272 0+18426649695542329970

也许它们有助于理解我做错了什么

根据您问题中的评论,您似乎正在使用新Z3 API中提供的策略和其他功能。从版本4.0开始,引用计数是Z3API中管理内存的默认方法。Z3 API仍然支持旧的内存管理策略(当使用API
Z3_mk_context
而不是
Z3_mk_context_rc
时,启用该策略)。但是,旧的内存管理策略不适用于版本4.0中引入的新对象(例如
解算器
策略
,…)


Z3发行版包含一个Python API。Python API的源代码位于Z3发行版的子目录
Python
中。它演示了如何在托管语言(如Python)中集成Z3API。我相信类似的方法也可以用于在Java中集成Z3API。其思想是用Java对象包装器包装每个Z3对象。引用计数器应该在构造函数中递增,并在Java垃圾收集器回收包装器时递减

引发异常是因为我的主程序和java垃圾回收器同时访问Z3。我解决了让
对象线程安全的问题,用方法包装它

为什么不从Java调用?在windows上,32位和64位的原生
long
大小相同。在OSX和linux上,大小不同。你在每个平台上运行哪个拱门?如果您在不同的拱门上运行,并且在映射中没有考虑到这一点(顺便说一句,您没有提供任何示例-您应该提供本机和JNA声明),那么您将得到内存错误。我在64位机器上运行mac os和windows,但linux是32位的。请注意,在多次调用此过程后会引发异常,几乎是随机的。ScalaZ3不支持我需要的许多功能(如tacticals),这就是我使用jna的原因。尝试在linux 64位上运行,您可能会看到相同的错误。跑
    Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
0   libz3.dylib                     0x00000001250d4d64 unsigned int ast_array_hash<expr>(expr* const*, unsigned int, unsigned int) + 244
1   libz3.dylib                     0x00000001250cb16a ast_manager::register_node_core(ast*) + 36
2   libz3.dylib                     0x00000001250cbeae ast_manager::mk_app_core(func_decl*, unsigned int, expr* const*) + 134
3   libz3.dylib                     0x00000001250cc30d ast_manager::mk_app(func_decl*, unsigned int, expr* const*) + 749
4   libz3.dylib                     0x000000012528c194 map_proc::reconstruct(app*) + 214
5   libz3.dylib                     0x00000001254830b8 void for_each_expr_core<qe::lift_foreign_vars, obj_mark<expr, bit_vector, default_t2uint<expr> >, false, false>(qe::lift_foreign_vars&, obj_mark<expr, bit_vector, default_t2uint<expr> >&, expr*) + 760
6   libz3.dylib                     0x00000001254832c9 qe::lift_foreign_vars::lift(obj_ref<expr, ast_manager>&) + 61
7   libz3.dylib                     0x00000001254833a6 qe::datatype_plugin::simplify(obj_ref<expr, ast_manager>&) + 92
8   libz3.dylib                     0x000000012546b1a7 qe::quant_elim_plugin::check(unsigned int, app* const*, expr*, obj_ref<expr, ast_manager>&, bool, ref_vector<app, ast_manager>&, qe::def_vector*) + 535
9   libz3.dylib                     0x000000012546b8f9 qe::quant_elim_new::eliminate_block(unsigned int, app* const*, obj_ref<expr, ast_manager>&, ref_vector<app, ast_manager>&, bool, qe::def_vector*) + 445
10  libz3.dylib                     0x000000012545f2cb qe::quant_elim_new::eliminate_exists(unsigned int, app* const*, obj_ref<expr, ast_manager>&, ref_vector<app, ast_manager>&, bool, qe::def_vector*) + 67
11  libz3.dylib                     0x0000000125462170 qe::quant_elim_new::eliminate_exists_bind(unsigned int, app* const*, obj_ref<expr, ast_manager>&) + 88
12  libz3.dylib                     0x000000012545c0ba qe::expr_quant_elim::elim(obj_ref<expr, ast_manager>&) + 1012
13  libz3.dylib                     0x000000012545cb75 qe::expr_quant_elim::operator()(expr*, expr*, obj_ref<expr, ast_manager>&) + 113
14  libz3.dylib                     0x000000012548b993 qe_tactic::imp::operator()(ref<goal> const&, sref_buffer<goal>&, ref<model_converter>&, ref<proof_converter>&, obj_ref<dependency_manager<ast_manager::expr_dependency_config>::dependency, ast_manager>&) + 783
15  libz3.dylib                     0x00000001255debfa cleanup_tactical::operator()(ref<goal> const&, sref_buffer<goal>&, ref<model_converter>&, ref<proof_converter>&, obj_ref<dependency_manager<ast_manager::expr_dependency_config>::dependency, ast_manager>&) + 14
16  libz3.dylib                     0x00000001255d5e3d exec(tactic&, ref<goal> const&, sref_buffer<goal>&, ref<model_converter>&, ref<proof_converter>&, obj_ref<dependency_manager<ast_manager::expr_dependency_config>::dependency, ast_manager>&) + 109
17  libz3.dylib                     0x0000000125070ed8 _tactic_apply + 680
18  libz3.dylib                     0x00000001250711d9 Z3_tactic_apply + 105
19  jna4404318687023840668.tmp      0x000000010a00cd1c ffi_call_unix64 + 76
20  jna4404318687023840668.tmp      0x000000010a00c884 ffi_call + 644
21  jna4404318687023840668.tmp      0x000000010a003ca5 Java_com_sun_jna_Native_ffi_1prep_1cif + 1605
22  jna4404318687023840668.tmp      0x000000010a004282 Java_com_sun_jna_Native_invokePointer + 34
23  ???                             0x00000001031cfd2e 0 + 4347198766
24  ???                             0x00000001031cd658 0 + 4347188824
25  ???                             0xffb89c44ff5c4272 0 + 18426649695542329970