我使用g ++,警告级别为-Wall -Wextra
,并将警告视为错误(-Werror
)。g ++编译器中的“未初始化的使用”警告
现在我有时会收到错误“变量可能在此函数中未初始化使用”。
“有时”是指我有两个独立的编译单元,它们都包含相同的头文件。一个编译单元编译没有错误,另一个编译单元给出上述错误。
头文件中的相关代码段如下。由于该功能相当长,我只能复制下面的相关位。
确切的错误是:
“cmpres”可在此功能
使用未初始化的而且我通过以下*
标有错误的行。
for (; ;) {
int cmpres; // *
while (b <= c and (cmpres = cmp(b, pivot)) <= 0) {
if (cmpres == 0)
::std::iter_swap(a++, b);
++b;
}
while (c >= b and (cmpres = cmp(c, pivot)) >= 0) {
if (cmpres == 0)
::std::iter_swap(d--, c);
--c;
}
if (b > c) break;
::std::iter_swap(b++, c--);
}
(cmp
是一个算符,它有两个指针x
和y
和返回-1,0或1,如果*x < *y
,*x == *y
或*x > *y
分别的其它变量的指针到相同的阵列。)
这段代码是更大功能的一部分,但变量cmpres
用于其他地方。因此我不明白为什么会产生这个警告。此外,编译器显然理解cmpres
永远不会被读取未初始化(或至少,它并不总是警告,见上文)。
现在我有两个问题:
为什么不一致的行为?此警告是否由启发式生成? (这似乎是合理的,因为发出此警告需要进行控制流分析,这在一般情况下是NP难以处理的,并且不能总是执行。)
为什么警告?是我的代码不安全?我已经开始欣赏这个特别的警告,因为它使我很难在其他情况下检测到错误 - 所以这个是有效的警告,至少有时候。这里有效吗?
只要说`int cmpres = 0;`在for(;;)`循环之外并且继续你的生活;) – fredoverflow 2011-02-06 12:28:26
@Fred我的问题不是让警告消失,而是看警告实际上是*正确*,我只是太愚蠢,不能注意到我的代码中存在错误。 – 2011-02-06 12:40:27