关于代码示例分析的反馈(安全编码)

Kai*_*aan 5 c types loops integer-overflow

我有一段我不确定的作业代码.我有信心我知道答案,但我只是想与社区仔细检查,因为我忘记了一些事情.标题基本上是安全编码,问题只是解释结果.

int main() {
   unsigned int i = 1;
   unsigned int c = 1;
   while (i > 0) {
     i = i*2;
     c++;
   }
   printf("%d\n", c);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的理由是这样的:

乍一看,你可以想象代码将永远运行,考虑到它被初始化为正值并且不断增加.这当然是错误的,因为最终这个值会变得如此之大,会导致整数溢出.这反过来也不完全正确,因为最终它会强制变量'i'通过将最后一位设为1来进行签名,因此被视为负数,因此终止循环.因此,它不会写入未分配的内存,因此会导致整数溢出,而是会违反数据类型,从而导致循环终止.

我很确定这是原因,但我只想仔细检查.任何意见?

sha*_*oth 5

不,unsigned int永远不会将零作为有符号数进行比较.循环结束的唯一机会是变量准确为零.

后者肯定会发生一次,因为你在每次迭代中乘以2(偶数),这会导致从右边(最不重要的位)插入一个零位,所以在经过一定次数的迭代后,所有非零位都将是"从数字中移出"它将变为零.