standard-library - put(NULL) - 为什么 WP+RTE 不提示?

标签 standard-library frama-c

考虑这个小 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 规范的缺陷吗?

最佳答案

基本上是的。您可以在与 Frama-C 捆绑的 stdio.h 版本中看到 puts 的规范为

/*@ assigns *stream \from s[..]; */
extern int fputs(const char * restrict s,
     FILE * restrict stream);

即最低限度是一个 assigns 子句(加上 Eva 的 from 子句)。 sstream 的先决条件。在 s 上添加前提条件很容易;对于 stream 来说事情更加复杂,因为您需要一个 FILE 类型的各种对象的模型。

关于standard-library - put(NULL) - 为什么 WP+RTE 不提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55837199/

相关文章:

python - 将 fractions.Fraction 转换为 decimal.Decimal 的最佳方法?

ocaml - 将结果放入 OCaml 中的字符串变量中

frama-c - 在 Frama-C 中使用影响分析

frama-c - FramaC值(value)分析中的slevel选项

c++ - 包含 <string> 时 xutility 出错

c++ - pair.first 是否返回对第一个值的引用?

list - 如何在不强制的情况下将列表扁平化为列表?

c++ - iostream 或 C++ 中的其他地方是否有称为时间的东西?

ocaml - ocamlgraph 中的编译错误

c - ACSL - 无法证明功能