wp插件打印的最弱前提格式

时间:2015-02-15 03:23:35

标签: frama-c

我不理解frama-c中wp插件打印的wp格式。 一个例子:

Goal Assertion 'P402926' (file gzip-1.5/deflate.c, line 479):
Let x_0 = Mint_0[(shift match_8 1)].
Let x_1 = Mint_0[(shift scan_16 1)].
Let x_2 = Mint_0[(shift scan_17 1)].
Let a_0 = (global G_window_2513).
Let x_3 = Mint_0[(shift a_0 (1+cur_match_1))].
Let x_4 = Mint_0[scan_17].
Let x_5 = Mint_0[(shift a_0 cur_match_1)].
Assume {
  (* Domain *)
  Type: (is_sint32 best_len_1) /\ (is_sint32 len_0)
        /\ (is_uint32 cur_match_1) /\ (is_uint8 Mint_0[match_0])
        /\ (is_uint8 Mint_0[match_1]) /\ (is_uint8 Mint_0[match_2])
        /\ (is_uint8 Mint_0[match_3]) /\ (is_uint8 Mint_0[match_4])
        /\ (is_uint8 Mint_0[match_5]) /\ (is_uint8 Mint_0[match_6])
        /\ (is_uint8 Mint_0[scan_1]) /\ (is_uint8 Mint_0[scan_3])
        /\ (is_uint8 Mint_0[scan_5]) /\ (is_uint8 Mint_0[scan_7])
        /\ (is_uint8 Mint_0[scan_9]) /\ (is_uint8 Mint_0[scan_11])
        /\ (is_uint8 Mint_0[scan_13]) /\ (is_uint8 x_4) /\ (is_uint8 x_0)
        /\ (is_uint8 x_1) /\ (is_uint8 x_2) /\ (is_uint8 x_5)
        /\ (is_uint16
(* gzip-1.5/deflate.c:453: Else *)
  Have: x_4=x_5.
  (* gzip-1.5/deflate.c:454: Else *)
  Have: x_2=x_3.
  (* gzip-1.5/deflate.c:468: Conditional *)
  If: x_0=x_1
  Then {
    (* gzip-1.5/deflate.c:468: Conditional *)
    If: Mint_0[(shift match_8 2)]=Mint_0[(shift scan_16 2)]
    Then {
      (* gzip-1.5/deflate.c:469: Conditional *)
      If: Mint_0[(shift match_8 3)]=Mint_0[(shift scan_16 3)]
      Then { .....

引入了许多额外的变量,我不理解像shift,global等,它们不在程序中。

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

您可以在the WP manual的第3章和第4章中找到WP用于构建证明义务的内部语言的简要说明。此外,公式中显示的内置函数和谓词在.why中的各种$(frama-c -print-share-path)/wp/why3文件中定义,尤其是Memory.why,这些都会对所有与内存相关的操作进行公理化。

回答您的主要讯问:

  1. if-else这里是为了避免每个函数的分支数量的证明义务数量呈指数性爆炸(以更复杂的公式为代价)
  2. global获取全局地址。您可以在此处看到a0随后被用作Mint_0地图中的索引(将地图格式的地址+偏移量映射到值)。
  3. shift移动地址的偏移量:shift a_0 cur_match_1指的是window数组的相应单元格。