- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们一直在使用 Frama-C 对商业项目进行“实验性”静态分析(集成到我们的 CI 中,在整个代码库的一小部分上进行一些选择性阻塞检查) .
出现的问题之一涉及满足 wp
插件在遇到 memcpy
调用时生成的证明义务。具体而言,以下三项义务:
从“目标”注释来看,Frama-C 似乎正在尝试证明目标内存和源内存是有效的。
我尝试添加 requires\valid()
先决条件,但这似乎没有帮助。在这些情况下,被测函数内的 memcpy
调用会将数据从输入参数复制到函数,并将该数据放入局部变量(作用域在函数内)。
更复杂的是,复制数据的局部变量是打包结构中的一个属性。
具体来说,我希望有人能够分享一些 memcpy
使用的真实示例,可以满足 wp
引入的目标(例如,什么先决条件)我必须添加才能证明它吗?)
如果重要的话,我正在运行 Frama-C Magnesium-20151002(根据 Ubuntu 16 上的 apt-get,这是“最新的”),并使用以下参数进行调用:
frama-c -wp -wp-split -wp-dynamic -lib-entry -wp-proof alt-ergo -wp-report
也相关,但缺少一个清晰的工作示例:Frama-c : Trouble understanding WP memory models
最佳答案
正如您在评论中提到的,正确的解决方案是使用 -wp-model "Typed+Cast"
为了让 WP 接受来自 void*
的强制转换(更准确地说,它会认为 p
和 (void*)p
对于任何指针来说都是相同的,这足以证明 requires
的 memcpy
)。现在,正如 the answer 中提到的对于您链接到的问题,此内存模型的主要问题(以及它不是默认模型的原因)是它本质上不安全:它依赖于根据定义无法评估的假设WP本身。这是一个突出这个问题的小例子:
int x;
char* c;
/*@ assigns c;
ensures c == ((char *)&x);
*/
void g(void) {
c = &x;
}
/*@ assigns \nothing;
ensures \separated(&x,c);
*/
void f() {
}
void main () {
g();
f();
//@ assert \false;
}
基本上,默认Typed
内存模型确保 c
指向的位置之间的分离和x
(即 f
的后置条件),因为 int
和char
是不同的,你都无法证明 g
的后置条件或者用它作为假设来推导\false
在main
,因为等式根本无法在模型中表达。
现在,如果您使用 Typed+Cast
, g
的后置条件现在已经被正确理解了,而且证明起来也很简单。 WP 不会让你同时证明&x
和c
分开,因为他们一起参与一项任务。然而,在 f
不存在这样的赋值,并且后置条件也很容易证明,导致证明 \false
在main
因为我们对 &x
有两个相互矛盾的陈述和c
。更一般地说,WP 依赖本地别名分析来跟踪不同类型指针之间的潜在别名(全局分析将违背模块化分析器的目的)。传递选项-wp-model +Cast
因此可以被视为告诉 WP“相信我,程序不会创建错误输入的别名”的方式。然而,可以手动传递别名信息(或者借助尚未编写的全局别名检测插件)。例如,使用选项 -wp-alias-vars x,c
f
的后置条件变成Unknown
(即 &x
和 c
之间的分离不再是一个假设,即使对于 f
也是如此)。
关于frama-c - 满足 memcpy 的证明义务吗? [框架-C],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53736914/
当我使用 frama-c 分析我的 c 程序时。 frame-c 的影响插件中似乎存在一个错误。这是我的程序。 #include int global; int main() { global
抱歉,如果这在某处有详细说明,我尝试在 Frama-C 的不同文档中进行搜索,但没有走运。 我正在尝试在我的代码中进行死代码消除,但我不明白该工具的结果。是否有任何文件/文档可以解释此插件的工作原理?
我是 Frama-c 的新手,我想了解这个简单示例有什么问题: /*@ requires \valid(array+(0..length-1)) @ ensures \forall integer k
我有一个 16 位 MPU,它与 x86_16 的大小不同 size_t , ptrdiff_t等。谁能给我详细说明和明确说明如何在 Frama-C 中为我的 MPU 自定义机器依赖项? 最佳答案 目
我正在尝试使用 frama-c 验证以下代码段 /*@ ensures \result != \null; @ assigns \nothing; @*/ extern int *new_va
在 EVA tutorial ,我找到了这个截图:并解释:“导致此问题的确切值显示在列 c5 中:-1。C 标准将负数的左移视为未定义行为。因为 -1 是此调用堆栈中唯一可能的值,因此减少由警报引起的
我想分析一个大型项目的文件以使用 Frama-C 创建程序依赖图,但不断出现奇怪的错误,例如: /usr/include/bits/fcntl-linux.h:305:[kernel] user er
有人可以告诉我这是 Frama-C 中整数和无符号整数的非确定性值的正确模型吗? /* Suppose Frama-C is installed in /usr/local -default pref
使用某些基准运行 Frama-C 值分析时,例如susan 在 http://www.eecs.umich.edu/mibench/automotive.tar.gz 中,我们注意到很多 block
我想证明 Frama-C 中欧几里德除法的循环实现: /*@ requires a >= 0 && 0 =0; loop assigns q,r; loop variant r;
我正在尝试学习 ACSL,但在尝试编写完整的规范时遇到了困难。我的代码 #include #include #define NUM_ELEMS (8) /*@ requires expected
我尝试在 Windows 7 上运行 Frama-C,但没有成功。 我已阅读您在这里写的所有提示和评论,但仍然不起作用。 有人可以用一种清晰简单的方式解释安装过程吗,我将不胜感激? 最佳答案 Wind
我正在尝试在函数中插入断言。这是我所做的: void foo(int a) { //@ assert a == 1; } void main() { foo(1); foo(2);
我刚刚开始开发一个 frama-c 插件,该插件正在执行某种别名分析。我正在使用 Dataflow.Backwards 分析,现在我必须遍历不同的赋值语句并收集一些有关左值的内容。 frama-c 是
这感觉像是一个愚蠢的问题,但我被难住了。我正在尝试使用 Frama-C Sodium 和 Why3 0.86.1(均通过 OPAM 安装)来证明一些简单的属性。考虑这个程序 (toy.c): int
我正在尝试验证来自 Frama-C + WP 的简单程序。 #include /*@ requires valid_read_string(s); assigns \
尝试使用推荐的 opam 方法安装 Frama-C 会出现以下错误: ### stdout ### # Cleaning Installation directory # Installing
我找到的最接近的答案可能与 Eva 插件的 -absolute-valid-range 有关,但真的是这样吗?我是否必须想出读/写 ACSL 谓词来执行虚拟读/写? 示例代码: #include #
我想对多个 文件执行代码转换,并将这些转换产生的更改写回原文件,最好是原始文件。例如,我想向源自文件 fileA.c 的函数 funcA 和函数 funcB 添加一个 if 语句在文件 fileB.c
我应该如何证明如下代码的正确性,为了避免效率低下,它依赖于模运算? #include uint32_t my_add(uint32_t a, uint32_t b) { uint32_t r
我是一名优秀的程序员,十分优秀!