是否可以在 frama-c 中指定缓冲区访问子句?

Is it possible to specify a buffer access clause in frama-c?

假设我有以下功能:

void process_data(uint32_t * data, size_t length) {
    for (size_t i = 0; i < length; i++) {
        foo(data[i]);
    }
}

我如何告诉 Frama-C“此函数确保对 data[i] 的每次访问都满足条件 i < length”?据我所知,我可以在读取 data 的每一行代码附近放置一个断言,但是有更好的方法吗?

为防止无效内存访问,您需要检查此函数是否始终使用 data 指针调用,从中至少可以读取 length 个元素。所以你需要写一个前置条件:

//@ requires \valid_read (data + (0 .. length-1));
void process_data(uint32_t * data, size_t length) {

所以如果你能确保这个属性是有效的,它保证你不会有任何无效的内存访问。