如何正确设置Cil.useLogicalOperators为true?附代码求验证
回答
你的代码存在两处问题,无法保证稳定生效:
- 存在基础语法错误:开头的
Open Cil写法错误,OCaml中打开模块的关键字是全小写的open,大写开头的Open会直接触发编译报错。 - 配置赋值的执行时序没有强保障:你直接把
Cil.useLogicalOperators := true写在顶层作用域,虽然单看这行的赋值语法是正确的——useLogicalOperators本身是bool ref类型的可变引用,:=是OCaml中给引用类型赋值的标准操作符,只要这行代码执行到确实会把配置设为true——但如果CIL内部的初始化逻辑、或者其他依赖模块的逻辑在这行代码执行前就已经运行,这个开关不会对已完成的逻辑生效,会导致你后续匹配LAnd/LOr时出现预期外的结果。
修正方案
你需要把配置赋值的逻辑绑定到单元值上,强制它作为顶层初始化的第一个执行项,放在所有CIL相关操作、自定义函数定义的最前面,修正后的代码如下:
open Cil (* 全局开关必须在所有CIL接口调用前完成设置 *) let () = Cil.useLogicalOperators := true let fct op = match op with | LAnd | LOr -> true | _ -> false
补充说明:
LAnd和LOr是CIL中专门用来表示短路逻辑与、逻辑或的构造子,只要你在调用CIL的文件解析、AST构造、表达式遍历类接口前完成上述开关设置,就可以正常匹配、构造这两类节点,不会被CIL自动降级为按位运算节点。
内容的提问来源于stack exchange,提问作者GeePi
相关产品推荐
相关产品推荐

