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 处理初始化断言的更多信息。
我正在探索 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 处理初始化断言的更多信息。