以以下C代码为例:
int main(int argc, char *argv[])
{
signed char i;
unsigned char count = 0xFF;
for (i=0; i<count;i++)
{
printf("%x\n", i);
}
return 0;
}
即使我按照以下方式编译,此代码仍会在无限循环中运行:
# gcc -Wall -Wpedantic -Wconversion -Wsign-compare -Wtype-limits -Wsign-conversion test.c -o test
是否有编译器标志可以警告此类问题?
只是为了明确,我不是在问'为什么会产生无限循环',而是想知道是否有一种方法可以使用编译器或静态分析来防止它?
CHAR_MAX
<INT_MAX
,则将其提升为int
并进行加法运算将产生一个定义良好的结果,该结果小于INT_MAX
;需要将CHAR_MAX+1
到INT_MAX
之间的值转换为signed char
,以便产生一个实现定义的值或引发一个实现定义的信号。 - supercat