簡體   English   中英

Frama-C命令功能

[英]Frama-C order function

我試圖用ACSL語言證明我的排序函數'order'與Frama-C的正確性。 我有一個額外的'swap'函數來置換我的數組't'的兩個值。

編輯:我更新了我的代碼。

/*@ 
    requires \valid (t+ (0..(l-1)));
    requires l > 0;
    requires i<l && j<l && i>=0 && j>=0;
    assigns t[i], t[j];
    ensures t[j] == \old(t[i]);
    ensures t[i] == \old(t[j]);
*/
void swap(int *t, int l, int i,int j){
  int tmp;
  tmp = t[i];
  t[i] = t[j];
  t[j] = tmp;
  return;
}

/*@ 
    requires \valid (t+ (0..(l-1)));
    requires l > 0;
    ensures \forall integer k; (0 <= k < l-1) ==> t[k] <= t[k+1]; 
*/
void order(int *t, int l) {
  int i;
  int j;
/*@
    loop assigns i, t[0 .. l-1];
    loop invariant 0<=i<l && i>=0;
    loop invariant \forall integer k; (0 <= k<=i) ==> t[k] <= t[k+1]; 
    loop variant l-i;


*/
  for (i=0;i<l;i++) {

/*@
    loop assigns j, t[0 .. l-1];
    loop invariant i<=j<l && i>=0 && j>=0;
    loop invariant  \forall  integer k; (0 <= k <= j)  ==> (t[k] <=  t[k+1]);
    loop variant l-j;

*/
    for (j=i; j<l; j++) {

      if (t[i] > t[j]){
    /*@ assert t[i] > t[j] && i<l && j<l && i>=0 && j>=0 ; */
    swap(t, l, i, j);
    /*@ assert t[i] < t[j] && i<l && j<l && i>=0 && j>=0 ; */
      }
    }
  }
}

在此輸入圖像描述 謝謝你的幫助!

與使用WP時一樣,至關重要的是,所有被證明的函數調用的函數都配有與assigns子句的契約。 此外,證明下的所述函數的所有循環必須具有loop assigns子句。 如果不是這種情況,WP將得出結論,內存狀態的任何部分都可能被調用(相應的循環)修改,因此在相應的指令之后它將無法說出任何有意義的內容。

因此,至少應該通過以下方式添加/替換現有子句:

  • swap合同中,一個條款assigns t[i], t[j];
  • 在外循環的循環注釋中,子句loop assigns i, t[0 .. l-1];
  • 在內循環的循環注釋中,子句loop assigns j, t[i .. l-1];

正如關於loop assigns附注:

  • 它們必須描述從第一次進入循環直到當前步驟的所有潛在修改(因此t[i], t[j]是不夠的,因為在當前j之前可能存在其他交換)。
  • 循環的索引(這里是ij )必須是循環賦值的一部分,盡管很容易忽略它並想知道為什么WP不滿意。

請注意,注釋可能存在其他問題,但這些是最明顯的問題,並且在嘗試證明更深層次的功能屬性之前,擁有適當的assigns子句可能是最重要的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM