我正在尝试使用CBMC(C Bounded Model Checking:https://www.cprover.org/cbmc/)来自GitHub的开源C项目。出于这个问题的目的,让我们考虑以下项目:https://github.com/reubenhwk/radvd
当我使用gcc编译项目时出现问题。我能够获得调用cbmc之类的
的可执行文件cbmc radvd
但我收到以下错误消息:
CBMC version 5.8 64-bit x86_64 linux
failed to open input file radvd`
原因应该是我使用gcc而不是goto-cc(如此处所解释的:http://www.cprover.org/cprover-manual/goto-cc.html),因此它可能无法识别该文件。
我也尝试使用goto-cc,如上一个链接和某些例子{@ 3}}中所述。但是,由于它们是引导示例,因此使cbmc工作变得容易。当我对其他项目执行相同的过程时,例如链接的(radvd)并使用goto-cc而不是gcc,我在运行make CC=goto-cc
命令时获得以下消息:
make all-am
make[1]: Entering directory '/home/stefano/Documents/github/radvd'
YACC gram.c
updating gram.h
CC libradvd_parser_a-gram.o
/usr/include/stdlib.h:133:1: error: syntax error before 'strtof128'
PARSING ERROR
Makefile:941: recipe for target 'libradvd_parser_a-gram.o' failed
make[1]: *** [libradvd_parser_a-gram.o] Error 1
make[1]: Leaving directory '/home/stefano/Documents/github/radvd'
Makefile:755: recipe for target 'all' failed
make: *** [all] Error 2`
我目前正在虚拟Linux机器上使用vbmc的5.8版本(Ubuntu 17.10)。
您对如何使其有效有任何想法吗?
谢谢
答案 0 :(得分:0)
当我用gcc编译项目时会出现问题。
CBMC不能像gcc生成的二进制文件那样运行。
CBMC分析由.goto
产生的特殊文件格式goto-cc
。该文件实质上只是一个普通程序,但会稍作重新排列,并添加了一些额外的信息以帮助分析。
CBMC拒绝在gcc生成的二进制文件上运行,因为它识别出该文件不是CBMC期望的.goto
格式。
当我使用goto-cc而不是gcc时,我收到以下消息...
正如评论中指出的那样,这是因为goto-cc不知道如何使用__float128
类型,因为它专用于GCC。
正如Nominal Animal所建议的那样,使用make CC="goto-cc '-D__float128=long double'"
可以将类型更改为goto-cc可以识别的类型,但是最好与CBMC开发人员联系并询问如何最好地处理这种情况。
此外,如果您还没有遇到过,CBMC User Manual可能会有用。