我很想知道是否可以将 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”分配未初始化的变量时,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);
}
这种方法增加了太多的开销,无法包含在现有代码中(增加了很多噪音和烦人的维护),所以我想知道是否有其他方法可以告诉编译器变量未初始化。
我知道有静态检查器并且我确实使用了这些,但我正在寻找可以在编译时发出警告并且没有误报的东西,我相信在这种情况下这是可能的并且可以避免某些类别的错误。