[英]Why this program need more than 45 input to occur buffer overflow(segmentaion fault)?
[英]Why may an overflow occur in the following program?
void main () {
int i;
if (i < 0) { i = -i; };
}
任何人都可以帮助我理解为什么在上述程序中可能出现溢出?
可能发生溢出,因为二进制补码中的整数表示的范围不对称:可以表示的最小负数的大小是可以表示的最高正数的大小加1。 例如,在32位系统上,值为-2,147,483,648
和2,147,483,647
。 这就是为什么否定-2,147,483,648
会导致溢出:否定的结果,正值2,147,483,648
,不能用相同大小的int
表示。
请注意,此问题的反之亦然:否定正数不会导致溢出:
if (i > 0) { i = -i; } // No overflow here
堆栈中的“i”值在主启动时未定义。 调用main()之前运行的启动代码可以在那里留下任何东西。
加上Kashif所说的,负整数可以比非负整数低一个值,因为负数不需要留下零空间。 符号位中的“1”(所有剩余的位为零)在符号反转时导致溢出。
在16位:-0x8000 == ~0x8000 + 1 == 0x7FFF + 1 == 0x8000
//“ - ”负值==反转+ 1 ==倒置+ 1 ==最终是相同的
这个值的可能性很低,但存在。 除非堆栈恰好包含有问题的数字,否则不会发生。
整数溢出的原因是算术运算尝试创建一个数值,该数值超出了可以用给定位数表示的范围,该位数大于最大值或小于最小可表示值。
i
没有初始化。 那么这里会发生的是,分配给整数类型变量i
的内存空间将包含一些垃圾值。 -2^31(-2,147,483,648)
则否定该值将导致整数溢出。 我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.