standard-library - puts(NULL) - 为什么 WP+RTE 不抱怨?
问题描述
考虑这个小 C 文件:
#include <stdio.h>
void f(void) {
puts(NULL);
}
我正在运行 Frama-C 的 WP 和 RTE 插件,如下所示:
frama-c-gui puts.c -wp -rte -wp-rte
我希望这段代码会产生valid_read_string(NULL);
或类似的证明义务,这显然是无法证明的。然而,令我惊讶的是,并没有发生这样的事情。这是标准库的 ACSL 规范的缺陷吗?
解决方案
基本上是的。您可以在stdio.h
与 Frama-C 捆绑在一起的版本中看到规范puts
为
/*@ assigns *stream \from s[..]; */
extern int fputs(const char * restrict s,
FILE * restrict stream);
即最低限度,一个assigns
子句(加上from
Eva 的一个子句)。s
和的前提条件stream
。添加前提条件s
很容易;事情更复杂,stream
因为你需要一个模型来处理各种类型的对象FILE
。
推荐阅读
- javascript - 在 React 中将数据导出到可变数量的组件
- r - 如何在 RMarkdown 中引用观星者表?
- ios - 在 SwiftUI 中,我如何区分一般点击与单元格中的按钮点击?
- postgresql - 在 wso2 流式集成器中使用 PostgreSQL 作为数据源,
- python-3.x - 使用多个 supervisord 程序线程来执行单独的 APScheduler 任务,还是使用一个带有一个调度程序的程序来执行多个任务?
- sendto - 在 Windows 文件资源管理器中动态和实时定义“发送到”文件的文件路径
- r - 在 R 中过滤包含多个值和 null 的列
- wordpress - wordpress 中的多个搜索过滤器选择一个类别和一个自定义帖子分类
- typescript - 如何修复 esLint “ parserOptions.project 已为 @typescript-eslint/parser 设置”?
- c++ - Particle.io waitFor() 函数类似于系统