c - Frama-C 是否捕获了读取未初始化堆栈变量的 UB?

标签 c verification frama-c

我正在探索 Frama-C 并尝试了这个示例,根据手册(第 83 页)应该处理它(CWE-457),以及 RTE 手册 2.7(整数有陷阱表示吗? http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2091.htm )应该被覆盖吗?

/*@ assigns \nothing; @*/
int f() {
  int a;
  return a;
}

/*@ assigns \nothing; @*/
int main() {
    if (f() < 0) {
        return 0;
    } else {
        return 1;
    }
}                                                                                                                                                
#include<stdio.h>

/*@ assigns \nothing; @*/
char f() {
  char a;
  return a;
} 
                                                                                                                                                          
/*@ assigns \nothing; @*/
int main() {
  char s[2];
  s[0] = f();
  s[1] = '\0';
  puts(s);
  return 0;
} 

但是,当我运行这些示例时,它们似乎通过了。这是预期的行为吗?

最佳答案

正如 manual of the RTE plugin 中提到的(诚然不是以非常突出的方式) ,在第 20 页的表 3.2 中,生成初始化相关断言的函数集默认为空。主要原因是它可能会生成大量断言(基本上每次使用未显式初始化的局部变量时),并且用户对它们的兴趣往往不如例如断言。无效的指针取消引用或算术溢出。

如果要为所有函数生成它们,则需要在 Frama-C 命令行上使用 -rte-initialized @all,如下所示:frama-c -wp - wp-rte -rte-initialized @all file.c。您可以在手册的第 2.7 节中找到有关 RTE 处理初始化断言的更多信息。

关于c - Frama-C 是否捕获了读取未初始化堆栈变量的 UB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70803875/

相关文章:

c - 使用 pthread 库时出现段错误

c - 在 gcc 中编译 c 时收到有关强制转换 "from pointer to integer of different size"的警告

arrays - Dafny:复制数组区域方法验证

static-analysis - 使用 ACSL/Frama-C 引入数学函数规范

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

c - Frama-c:将插件分析结果保存在c文件中

c - 赛格夫 : invalig write of size 8 when adding a node to the end of a linked list

将一系列字符转换为各自的 int

java - 注册安卓应用后发送验证邮件

php - 验证电子邮件格式 PHP