【发布时间】:2013-05-25 02:59:31
【问题描述】:
我很想知道是否可以将 C 中的变量显式污染为未初始化。
伪代码...
{
int *array;
array = some_alloc();
b = array[0];
some_free(array);
TAINT_MACRO(array);
/* the compiler should raise an uninitialized warning here */
b = array[0];
}
这是污染变量的一种方法的一个示例,但是当 'a' 被分配给未初始化的 var 时,GCC 会发出警告,而不是第二次使用 'a'。
{
int a = 10;
printf("first %d\n", a);
do {
int b;
a = b;
} while(0);
printf("second %d\n", a);
}
我能想出的唯一解决方案是用未初始化的变量显式隐藏变量,(添加了空格,因此没有未使用的警告)。
#define TAINT_MACRO_BEGIN(array) (void)(array); { void **array; (void)array;
#define TAINT_MACRO_END(array) } (void)(array);
{
int *array;
array = some_alloc();
b = array[0];
some_free(array);
TAINT_MACRO_BEGIN(array);
/* the compiler should raise an uninitialized warning here */
b = array[0];
TAINT_MACRO_END(array);
}
这种方法增加了太多开销,无法包含在现有代码中(增加了很多噪音并且维护起来很烦人),所以我想知道是否有其他方法可以告诉编译器变量未初始化。
我知道有静态检查器并且我确实使用了这些,但是我正在寻找可以在编译时发出警告并且没有误报的东西,我相信在这种情况下这是可能的并且可以避免某些类别的错误。
【问题讨论】:
-
如果指针在一个翻译单元中被释放,然后在另一个翻译单元中使用怎么办?编译器无法捕捉到。
-
some_index未在您的第一个示例中声明。我希望所有编译器都会抱怨这一点,而不是初始化。 -
不知道为什么您不喜欢
a = b;第二个示例中的警告 一个编译器也抱怨后续的错误使用 (printf("second %d\n", a);) 会很冗长。对于大多数调试来说,第一个警告就足够了。 -
我明白了,您正在尝试实现一个穷人的静态分析工具。为什么不直接使用真正的静态分析工具?既然你愿意装饰你的代码,splint 可能很适合你。
-
@user315052:所有静态分析是否也提供允许污染变量的注释功能?如果事实上,我很高兴知道哪些工具具有该功能。