【问题标题】:puts(NULL) - why doesn't WP+RTE complain?puts(NULL) - 为什么 WP+RTE 不抱怨?
【发布时间】:2019-09-14 04:08:43
【问题描述】:

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

【问题讨论】:

    标签: standard-library frama-c


    【解决方案1】:

    基本上是的。您可以在与 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 类型的各种对象建立模型。

    【讨论】:

    • 但这不会是一个安全漏洞吗?
    • 是的。但是,为了保证您的分析的合理性,您应该查看您没有实体的所有功能的合同。您应该在此阶段发现不充分的先决条件。为标准库的所有功能添加规范是一项艰巨的任务,Frama-C 团队会在时间允许的情况下这样做。具有先决条件的函数通常是合理建模的(尽管可能仍然存在错误);但只有赋值的函数不是。
    猜你喜欢
    • 1970-01-01
    • 2015-06-09
    • 2020-08-12
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 2021-06-27
    • 1970-01-01
    相关资源
    最近更新 更多