- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找到的最接近的答案可能与 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 认为它的值(value)可以是任何东西。特别是,没有关于 offset
的假设已知在评估 addr
时持有.您可以通过查看生成的目标在 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
的可变内容的两次读取访问.我不确定你是否真的想要 addr
参数为 volatile
(与指向 volatile
位置的非 volatile
指针相反),因为这需要一个非常奇怪的执行环境。
假设 volatile
限定符不应出现在 addr
的声明中,剩下的问题是对 offset
的约束在read32
太弱了:它应该读作 offset < 0x1000
具有严格的不等式(或 mmio_read32
的先决条件被设为非严格的,但这同样是非常罕见的)。
关于物理寻址和 volatile 的初始问题,在 ACSL 中(参见 the manual 的第 2.12.1 节),您有一个特定的 volatile
允许您指定(C,通常是 ghost)函数来表示对 volatile
的读写访问的子句位置。不幸的是,目前只能通过非公开分发的插件访问对这些条款的支持。
恐怕如果您想在具有物理地址的代码上使用 WP,您确实需要使用编码(例如,使用适当大小的虚拟数组)和/或使用适当的函数对 volatile 访问进行建模。
关于frama-c - 如何使用 frama-c Eva 插件或 WP-RTE 验证读取/写入硬件内存映射寄存器 (mmio) 的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52708059/
这个问题是关于 evas_object_image_data_set 的使用函数。 比如说,我有一些 RGBA 格式的像素数组。我对其进行转换,使其成为 ARGB,适合 Evas 图像对象。 接下来我
任何人都可以帮助我纠正错误:BORdbg70.exe BORdbg70.dll“内部错误 EVA 1528”。这个错误的原因是什么?我该如何解决这个问题。 参见 here如何设置远程调试 sessio
我正在尝试编写一个小应用程序,以了解 evas 如何与 X11 配合使用。我在文档中没有找到完整的示例,只有我尝试使用的一些部分。这是代码: #include #include #include
我对 Frama-C 18.0 版(Argon)的行为有点困惑。 给定以下程序: #include #include /*@ requires order: min <= max; ass
以下面的 C 代码为例。 struct foo_t { int bar; }; int my_entry_point(const struct foo_t *foo) { return
我不知道为什么下面的代码不起作用!但是如果我将 var eva = function(){alert("hello");} 更改为 function eva() {alert("hello");},它
在https://stackoverflow.com/a/57116260/946226我学会了如何验证在缓冲区(由开始和结束指针给定)上运行的函数 foo 确实只从缓冲区中读取,而是创建一个具有代表
我正在尝试在函数中插入断言。这是我所做的: void foo(int a) { //@ assert a == 1; } void main() { foo(1); foo(2);
我找到的最接近的答案可能与 Eva 插件的 -absolute-valid-range 有关,但真的是这样吗?我是否必须想出读/写 ACSL 谓词来执行虚拟读/写? 示例代码: #include #
每当我尝试使用我的 gitlab ci 构建我的 Angular 应用程序时,我都会收到以下错误: 我也尝试过使用 npm ci,因为那是一种更简洁的方式,但它给出了相同的错误,但也适用于 types
我是一名优秀的程序员,十分优秀!