在Frama-C中建模非确定性值整数

时间:2015-02-11 18:11:04

标签: frama-c

有人可以告诉我这是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中使用具有不同体系结构的上述代码,是否有任何例外?

2 个答案:

答案 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