簡體   English   中英

自動擴展Frama-C值分析

[英]Automatic widening in frama-c value analysis

我正在尋找一種在沒有用戶提示的情況下對循環執行擴展的方法。 我將使用一個示例進行說明:

int z;
void main(void) {   
    int r = Frama_C_interval(0, MAX_INT);
    z = 0;
    for (int y=0; y<r; y++)
        z++;
}

在此代碼上運行frama-c值分析時,全局變量z接收間隔[-,-]。 因為z設置為零,並且循環由增量運算符組成,所以自動加寬方法應該能夠推斷出更准確的間隔為[0,-]。 在Frama-C中可以這樣做嗎?

在此代碼上運行frama-c值分析時,全局變量z接收間隔[-,-]。

不,它不是:

~ $ frama-c -version ; echo
Magnesium-20151001+dev
~ $ cat t.c
#define MAX_INT 0x7fffffff

int z;
void main(void) {   
    int r = Frama_C_interval(0, MAX_INT);
    z = 0;
    for (int y=0; y<r; y++)
        z++;
}
~ $ frama-c -val t.c
…
t.c:8:[kernel] warning: signed overflow. assert z+1 ≤ 2147483647;
…
[value] Values at end of function main:
  z ∈ [0..2147483647]
…

這是開發版本,但由於簽名溢出開始被視為帶有ACSL警報的嚴重錯誤,因此該版本也適用於任何版本。 如果您使用的版本假定簽名溢出會無害地產生2的補碼結果,則1)您應該進行升級,已經有幾年了; 2)那么很難說z是平凡的正數(盡管由於a在循環執行時將zy的值關聯起來的關系不變式,值分析無法表示的關系不變式。

暫無
暫無

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

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