gpt4 book ai didi

c - 有没有办法在 GCC/Clang 中将变量设置为未初始化?

转载 作者:太空狗 更新时间:2023-10-29 16:56:03 25 4
gpt4 key购买 nike

我很想知道是否可以在 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);
}

这种方法增加了太多开销以包含在现有代码中(增加了很多噪音和烦人的维护),所以我想知道是否有其他方法告诉编译器变量未初始化。

我知道有静态检查器并且我确实使用了它们,但我正在寻找可以在编译时发出警告并且没有误报的东西,我相信在这种情况下这是可能的并且可以避免某类错误。

最佳答案

我在 GCC 列表上发送了一个答案,但由于我自己首先使用 SO...

在现代 C 和 C++ 中,我希望程序员使用有限的可变范围来控制这种曝光。

例如,我想你想要这样的东西(注意我使用的属性实际上并不存在,我只是想解释你的要求)。

int x = 1; // initialized 
int y; // uninitialized

x = y; // use of uninitialized value 'y'

y = 2; // no longer uninitialized
x = y; // fine

y = ((__attr__ uninitialized))0; // tell gcc it's uninitialized again

x = y; // warn here please.

如果是这样,我会在 C99(或更高版本)或 C++(漂亮确保至少从 1993 年的 ARM 开始就已经“在使用时声明”了……):

int x = 1; // initialized 

{
int y; // uninitialized
x = y; // warn here
y = 2; // ok, now it's initialized
x = y; // fine, no warning
}

{
int y; // uninitialized again!
x = y; // warns here
}

额外的范围有点令人反感,但我已经很习惯了C++(大量使用 RAII 技术。)

既然主流语言都有答案,我就不认为值得添加到编译器中。

看你的例子,你关心的是一个数组。那应该与额外的范围一样工作,并且不应该有额外的运行时成本,因为整个栈帧是在函数上分配的条目(至少是 SFAIK)。

关于c - 有没有办法在 GCC/Clang 中将变量设置为未初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16745981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com