【发布时间】:2018-10-08 18:23:15
【问题描述】:
我找到的最接近的答案可能与 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”或者这是预期的?
【问题讨论】:
-
严格来说,
-absolute-valid-range是 Frama-C 内核的一个选项,尽管据我所知 WP 无法利用这些信息。也就是说,有几种可能的解决方法,最合适的行动方案很大程度上取决于您的代码和您想要证明的属性:您需要在您的问题中更加具体(即向我们提供mcve)以便我们提供有意义的答案。 -
Virgile 我更新了问题以包含 mcve。我还发现未知状态可能与代码中的 volatile 变量有关。你知道 WP 插件是否可以处理 volatile 变量吗?
标签: frama-c