CBMC集成构建系统遇阻:radvd项目CBMC调用报错求助
解决CBMC无法处理radvd可执行文件的问题
我一眼就看出问题出在哪了——你搞错CBMC的处理对象啦!CBMC是针对C源代码或者编译中间表示(比如GCC的Gimple、LLVM IR)做有界模型检查的工具,它根本不认识gcc编译出来的二进制可执行文件。你直接给它传radvd这个二进制程序,它自然会报错说“failed to open input file”——不是找不到文件,是它读不懂这个格式。
接下来给你两种可行的解决办法:
方法一:直接用CBMC分析源代码
既然你已经拿到了radvd的源代码,直接让CBMC处理源码是最直接的方式,不过要记得传递和gcc编译时一致的参数(比如头文件路径、宏定义),不然CBMC可能找不到依赖的头文件或者解析不了编译宏:
- 找到radvd的主入口源文件(一般是
radvd.c) - 执行类似这样的命令(替换成你实际编译时用的参数):
这里的cbmc radvd.c -I./include -D_GNU_SOURCE -D_POSIX_C_SOURCE=200809L-I指定头文件目录,-D定义编译宏,要和你用gcc编译radvd时的参数完全对应,不然会出现编译错误。
方法二:生成GCC中间表示(Gimple)再分析
如果项目的编译参数特别复杂,手动给CBMC补参数太麻烦,可以让gcc生成中间表示文件,再传给CBMC处理:
- 用gcc编译源代码时加上
-fdump-tree-gimple参数,生成Gimple格式的中间文件:
执行完后会生成一个类似gcc -c radvd.c -I./include -D_GNU_SOURCE -fdump-tree-gimpleradvd.c.003t.gimple的文件 - 把这个中间文件传给CBMC:
cbmc radvd.c.003t.gimple
额外注意事项
- 如果radvd是多文件项目,你需要把所有相关的源文件(或者对应的Gimple文件)都传给CBMC,这样它才能分析完整的程序逻辑
- 尽量保证CBMC和gcc的版本兼容,不同版本的gcc生成的Gimple格式可能有差异,会导致CBMC解析失败
内容的提问来源于stack exchange,提问作者s.dallapalma
相关产品推荐
相关产品推荐

