簡體   English   中英

高循環邊界的值分析

[英]Value analysis for high loop bounds

我正在分析具有以下結構的控制程序:

unsigned int cnt=0;
unsigned int inc=3;
...

void main(){
int i;
int lim;

for(i=0;i<100000;i++)
{
  f1();
 ....
  lim = f2();
  if(cnt < lim)
    cnt += inc;
 ....
}
}

我的目標是分析足夠的循環迭代以表明 cnt 變量不會溢出。 單獨增加 slevel 不會有幫助,因為狀態空間會變得太高。 我看到可以針對各個功能調整 slevel。 這對於例如單個 if/else 構造也可能嗎? 對於這樣的循環結構,增加整個函數的 slevel 可能已經太多了。 有沒有辦法在不編寫復雜的循環不變量和斷言的情況下證明不存在溢出?

BR,哈拉爾

我冒昧地指定f2返回正數。 否則,測試if(cnt < lim)執行負 -> 無符號轉換,此時 Value 無法精確處理。 而事實上,你的財產成立,如果f2總是返回-1

在這種假設下, cnt不會溢出。

unsigned int cnt=0;
unsigned int inc=3;

//@ assigns \result \from \nothing; ensures 0 <= \result;
int f2();

void main(){
  int i;
  int lim;

  for(i=0;i<100000;i++)
    {
      f1();
      lim = f2();      
      if(cnt < lim)
        cnt += inc;
    }
}

這是分析的結果。 cnt沒有溢出,因為它的最大值是 4294967295。

[value] Values at end of function main:
  cnt ∈ [0..2147483649],0%3
  i ∈ {100000}
  lim ∈ [0..2147483647]

如果f2可以返回負值 <= -4,我不確定可以在不使用例如 WP 插件的情況下證明結果。

關於您的其余問題,有多種替代方法可以更好地使用分析所需的 slevel 量,但在這里可能沒有任何幫助。

暫無
暫無

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

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