使用frama-c引理检查无符号整数中的位不起作用

使用frama-c引理检查无符号整数中的位不起作用,frama-c,Frama C,我正在使用frama-c编写代码,该代码使用一个位字段来表示一个集合。比如说 typedef uint32_t myset_t; #define EMPTY_SET UINT32_C(0) #define FULL_SET UINT32_C(0x0ffffff) 所以我只使用32位无符号整数的n个最低位。然后我想实现一个谓词来检查myset\u t中是否设置了位。这并没有像预期的frama-c那样工作,alt ergo能够证明关于这类集合的东西,我可以产生一个简单的引理,它已经显示了

我正在使用frama-c编写代码,该代码使用一个位字段来表示一个集合。比如说

typedef uint32_t  myset_t;

#define EMPTY_SET  UINT32_C(0)
#define FULL_SET   UINT32_C(0x0ffffff)
所以我只使用32位无符号整数的n个最低位。然后我想实现一个谓词来检查myset\u t中是否设置了位。这并没有像预期的frama-c那样工作,alt ergo能够证明关于这类集合的东西,我可以产生一个简单的引理,它已经显示了我的问题。在我的安装frama-c 21.1钪上,它不能自动证明以下简单引理:

    lemma test:
        \forall integer i;
        (0U <= i < 16U) ==> (0xFFFFU & (1U << (unsigned int)i)) != 0U;

有人能向我解释我做错了什么,问题出在哪里吗?或者说,定理证明者不能自动正确地处理这些琐碎的算术问题吗?我的意思是,只有16种情况,我们可以列举它们。

似乎自动求解者无法处理WP生成的属性。可能是因为他们不能,或者可能是因为属性的编码

然而,正如你所说:

只有16个案例,可以列举出来

wpgui提供了一种生成这种证明的策略。一旦证明失败,双击窗口底部WP目标面板中的证明目标。然后选择要枚举的变量。单击战术范围,将下限设置为0,上限设置为15。最后,单击战术名称旁边的绿色箭头。WP将产生18个验证目标:


<0和>15:由于条件为0,因此自动解算器似乎无法处理WP生成的属性。可能是因为他们不能,或者可能是因为属性的编码

然而,正如你所说:

只有16个案例,可以列举出来

wpgui提供了一种生成这种证明的策略。一旦证明失败,双击窗口底部WP目标面板中的证明目标。然后选择要枚举的变量。单击战术范围,将下限设置为0,上限设置为15。最后,单击战术名称旁边的绿色箭头。WP将产生18个验证目标:

<0且>15:由于条件为0,所以很简单
frama-c -wp -wp-prover alt-ergo,tip file.c