有人可以告诉我这是Frama-C中整数和无符号整数的非确定性值的正确模型吗?
/* Suppose Frama-C is installed in /usr/local -default prefix */
#include "/usr/local/share/frama-c/builtin.h"
#include "/usr/local/share/frama-c/libc/limits.h"
...
#define nondet_int() Frama_C_interval(INT_MIN, INT_MAX)
#define nondet_uint() Frama_C_interval(0, UINT_MAX)
...

如果我在选项-machdep
中使用具有不同体系结构的上述代码,是否有任何例外?
答案 0 :(得分:3)
不,在霓虹灯版本中,如果要使用其他-machdep
,则必须手动定义相应的宏。您通常最终会得到一个命令行:
frama-c -cpp-extra-args="-D__FC_MACHDEP_X86_64" -machdep x86_64
即将发布的Sodium将使-cpp-extra-args
成为不必要的,并且默认情况下提供-I
选项让预处理器搜索到Frama-C的libc
标题,这样你就不会必须自己提供或依赖#include
指令中的绝对路径
NB:此答案并非对Sodium发布的任何特定日期的承诺。
答案 1 :(得分:1)
Frama_C_interval(0, UINT_MAX)
可能无法正常工作的一个原因是Frama_C_interval
的类型为int (int, int)
。当您碰巧需要整个范围的unsigned int
值时,实际上往往会有所帮助,因为引入的转换需要近似,但通常情况下Frama_C_interval
被声明为返回{int
1}}是一件令人讨厌的事。
最新发布的版本已经有Frama_C_unsigned_int_interval
,但它位于share/libc/__fc_builtin.h
(安装到/usr/local/share/frama-c/libc/__fc_builtin.h
。文件builtin.h
看起来像是一个残余的残余,特别是对于$ Id $ line可以追溯到在SVN下开发的时候。
为了指定值应该是所有可能的unsigned int
值,Frama_C_unsigned_int_interval(0, -1)
可以省去包含limit.h
的麻烦。根据C规则,作为参数传递的int
值-1
将转换为最大unsigned int
。