Frama-C 中的模型非确定性值整数

Model non-deterministic value integer in 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中使用不同架构的上述代码,是否有任何例外?

不,在 Neon 版本中,如果您想使用另一个 -machdep,您必须手动定义适当的宏。你通常会得到这样的 command-line:

frama-c -cpp-extra-args="-D__FC_MACHDEP_X86_64" -machdep x86_64

即将发布的 Sodium 版本将不再需要 -cpp-extra-args,并且默认提供 -I 选项让预处理器搜索 Frama-C 的 libc header,这样您就不必自己提供或依赖 #include 指令中的绝对路径

注意:此回答并非对 Sodium 发布的任何特定日期的承诺。

Frama_C_interval(0, UINT_MAX) 可能无法按预期工作的一个原因是 Frama_C_interval 的类型为 int (int, int)。当您碰巧想要 unsigned int 值的整个范围时,这实际上往往会有所帮助,因为引入的转换是近似的,但通常 Frama_C_interval 被声明为返回 int 很麻烦。

最新发布的版本已经有Frama_C_unsigned_int_interval,但它在share/libc/__fc_builtin.h(安装到/usr/local/share/frama-c/libc/__fc_builtin.h。文件builtin.h看起来像一个残留物,尤其是$Id$ 行可以追溯到在 SVN 下完成开发的时间。

为了指定一个值应该是所有可能的 unsigned int 值,Frama_C_unsigned_int_interval(0, -1) 省去了包含 limit.h 的麻烦。作为参数传递的 int-1 根据 C 规则转换为最大的 unsigned int