首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ACSL中强制内存位置有效?

如何在ACSL中强制内存位置有效?
EN

Stack Overflow用户
提问于 2017-07-20 18:33:28
回答 1查看 295关注 0票数 0

我将设备访问定义为这样

代码语言:javascript
复制
volatile struct mydevice * const dev = (struct mydevice *)MY_DEVICE_ADDRESS;

我已经将访问建模为

代码语言:javascript
复制
@ volatile dev->somereg reads somereg_read writes somereg_write;

现在的问题是,当我启用RTE检查时,生成的有效性检查无法被证明。

代码语言:javascript
复制
/*@ assert rte: mem_access: \valid(dev->somereg); */

是否有任何方法对我的代码进行注释,使MY_DEVICE_ADDRESS直到MY_DEVICE_ADDRESS+sizeof(struct )被认为是有效的?

编辑:这里有一个尝试不起作用

代码语言:javascript
复制
#include <stdint.h>

#define MY_DEVICE_ADDRESS (0x80000000)

struct mydevice {
  uint32_t somereg;
  uint32_t someotherreg;
};

volatile struct mydevice * const dev = (struct mydevice *)MY_DEVICE_ADDRESS;

/*@ axiomatic Physical_Memory {
     axiom Dev: \valid((struct mydevice*)MY_DEVICE_ADDRESS);
  } */

int main(int argc, const char *argv[]) {
  //@ assert \valid(dev);
  //@ assert \false;
  return 0;
}

同跑

frama-c-wp -wp-rte -wp-init-const -wp-模型类型测试.c

EN

回答 1

Stack Overflow用户

发布于 2017-07-21 13:56:49

我不知道(我也试过很多次)。

我找到的唯一解决办法是:

代码语言:javascript
复制
struct mydevice MY_DEVICE_STRUCT;
volatile struct mydevice * const dev = & MY_DEVICE_STRUCT;

您需要“实例化”内存,因为这正是底层LLVM所期望的。当然,通过ACSL表示法强制这样做是很好的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45222693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档