[英]Calculate reachability to a function using frama-c's value analysis
這是我的例子:
int in;
int sum(int n){
int log_input = n;
int log_global = in;
return 0;
}
int main(){
int n = Frama_C_interval(-10, 10);
in = n;
if (n > 0){
sum(n + 4);
}
return 0;
}
我想要做的是在main中初始化時找到輸入變量n的范圍,從而得到函數sum。 此示例中的正確范圍是[1,10]。
在示例中,我想將原始輸入“保存”在全局值中,並通過將其分配到變量log_global中來重新引入它,從而發現導致到達函數的原始輸入。 在此示例上運行frama-c時,我們得到log_input的范圍是[5,14],log_global的范圍是[-10,10]。 我理解為什么會發生這種情況 - in的值設置在main的開頭,並且不受對n的進一步操作的影響。
我想知道在frama-c中是否有一種簡單的方法可以改變它? 也許是對frama-c代碼的一個簡單修改?
我有一個不相關的想法是操縱main中的if語句:
if (in > 0){
sum(in + 4);
}
我使用全局變量而不是n 。 這確實產生了正確的范圍,但是這種解決方案不能很好地擴展到更復雜的功能和更深的調用堆棧。
這是一個可能的解決方案。 使用內置的Frama_C_interval_split
和一個適當的-slevel N
(這里,至少N=21
)。 函數sum
將被檢查N次,每個可能的N值一個,結果將是精確的
int n = Frama_C_interval_split(-10, 10);
結果:
[value] Values at end of function sum:
log_input ∈ [5..14]
log_global ∈ [1..10]
__retres ∈ {0}
(基本上,這相當於執行手動模型檢查,因此對於大的N值,性能不會很好。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.