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

Does Frama-C catch the UB of reading uninitialised stack variables?

我正在探索 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] = '[=11=]';
  puts(s);
  return 0;
} 

然而,当我 运行 这些例子时 frama-c -wp -wp-rte 他们似乎通过了。这是有意为之的行为吗?

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

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