![](/img/trans.png)
[英]What is the meaning and purpose of “after” column in Frama-C EVA plugin
[英]How to validate code that read/write to hardware memory mapped registers (mmio) with frama-c Eva plugin or WP-RTE?
我找到的最接近的答案可能與Eva插件的-absolute-valid-range
相關,但是它是什么? 我是否必須提出讀/寫ACSL謂詞進行虛擬讀/寫操作?
示例代碼:
#include <stdint.h>
#define BASE_ADDR 0x0e000000
#define BASE_LIMIT 0x0e001000
#define TEST_REG 0x10
/*@ requires BASE_ADDR <= addr < BASE_LIMIT;
@ assigns \nothing;
*/
static inline uint32_t mmio_read32(volatile uintptr_t addr)
{
volatile uint32_t *ptr = (volatile uint32_t *)addr;
return *ptr;
}
/*@
@ requires 0 <= offset <= 0x1000;
@ assigns \nothing;
*/
static inline uint32_t read32(uintptr_t offset)
{
return mmio_read32((uintptr_t)BASE_ADDR + offset);
}
void main(){
uint32_t test;
test = read32(TEST_REG);
return;
}
Frama-c命令和輸出:
[frama -absolute-valid-range 0x0e000000-0x0e001000 -wp mmio2.c
[kernel] Parsing mmio2.c (with preprocessing)
[wp] Warning: Missing RTE guards
[wp] 6 goals scheduled
[wp] [Alt-Ergo] Goal typed_read32_call_mmio_read32_pre : Unknown (Qed:4ms) (51ms)
[wp] Proved goals: 5 / 6
Qed: 5
Alt-Ergo: 0 (unknown: 1)][1]
如何釋放目標“typed_read32_call_mmio_read32_pre”或這是預期的?
證明失敗的事實與兩個獨立的問題有關,但它們都與使用絕對地址無關。
首先,由於mmio_read32
的參數被標記為volatile
,WP認為它的值可以是任何值。 特別是,在評估addr
時,已知在offset
上做出的假設都不成立。 您可以通過查看生成的目標在GUI中看到(進入底部的WP目標選項卡,然后雙擊Script
冒號和失敗的證明嘗試的行):
Goal Instance of 'Pre-condition'
(call 'mmio_read32'):
Assume {
Type: is_uint32(offset_0).
(* Pre-condition *)
Have: (0 <= offset_0) /\ (offset_0 <= 4095).
}
Prove: (234881024 <= w) /\ (w_1 <= 234885119).
w
和w_1
對應於對addr
的volatile內容的兩次讀訪問。 我不確定你是否真的希望addr
參數是volatile
(而不是指向volatile
位置的非易失volatile
指針),因為這需要一個非常奇怪的執行環境。
假設volatile
限定符不應該出現在addr
的聲明中,剩下的問題是read32
對offset
的約束太弱了:它應該讀取帶有嚴格不等式的offset < 0x1000
(或者mmio_read32
的前提條件是非嚴格的,但這又是不常見的)。
關於物理地址和易失性的初始問題,在ACSL中(參見本手冊第2.12.1節),您有一個特定的volatile
子句,允許您指定(C,通常為ghost)函數來表示對volatile
位置的讀寫訪問。 不幸的是,目前只能通過非公開分發的插件訪問這些子句。
我擔心如果你想在物理地址上使用WP代碼,你確實需要使用編碼(例如,使用適當大小的ghost數組),和/或使用適當的函數模擬易失性訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.