GCC 不抱怨未初始化的变量
GCC not complaining about uninitialized variable
为什么 gcc 没有抱怨 j 未初始化?如果我删除 j += 10 它实际上会抱怨...用 -Wall 编译(用 gcc 4.9 和 5.3 测试)。
int main(void)
{
int i;
int j;
int threshold = 100;
for (i = 0 ; i < 100 ; i++)
{
if (j >= threshold)
break;
j += 10; /* comment this line to enable uninitialized variable warning */
}
return 0;
}
您可能会在高优化级别编译它,这会导致出于优化目的删除循环。
所以尝试在 -O1
或 -O0
编译。
如果没有显示出来,请确保使用高警告级别,-Wall
和 -pendantic
一个优化器可以发现整个循环毫无意义,但有点复杂。循环是无意义的,因为循环后不使用 i 和 j 的值,循环内部仅使用 j 来决定何时提前中断,这也无关紧要,因为循环的迭代次数不会事情。所以在这种情况下,如果你将 j 初始化为一个随机数,你会得到完全相同的结果。所以编译器可能不会发出警告,因为不会发生有害的事情。
显然你有未定义的行为,所以整个应用程序可能会因为未初始化的变量而崩溃。但这取决于编译器,所以如果发生这种情况,您应该收到警告。
为什么 gcc 没有抱怨 j 未初始化?如果我删除 j += 10 它实际上会抱怨...用 -Wall 编译(用 gcc 4.9 和 5.3 测试)。
int main(void)
{
int i;
int j;
int threshold = 100;
for (i = 0 ; i < 100 ; i++)
{
if (j >= threshold)
break;
j += 10; /* comment this line to enable uninitialized variable warning */
}
return 0;
}
您可能会在高优化级别编译它,这会导致出于优化目的删除循环。
所以尝试在 -O1
或 -O0
编译。
如果没有显示出来,请确保使用高警告级别,-Wall
和 -pendantic
一个优化器可以发现整个循环毫无意义,但有点复杂。循环是无意义的,因为循环后不使用 i 和 j 的值,循环内部仅使用 j 来决定何时提前中断,这也无关紧要,因为循环的迭代次数不会事情。所以在这种情况下,如果你将 j 初始化为一个随机数,你会得到完全相同的结果。所以编译器可能不会发出警告,因为不会发生有害的事情。
显然你有未定义的行为,所以整个应用程序可能会因为未初始化的变量而崩溃。但这取决于编译器,所以如果发生这种情况,您应该收到警告。