为何GCC未检测变量初始化与运算溢出?编译无错的原因是什么?
GCC为何没检测到整数溢出?
首先要明确:C语言标准把有符号整数溢出定义为未定义行为,编译器没有强制要求必须检测这类情况,所以默认状态下GCC不会主动抛出错误或警告。
再拆分你遇到的两种场景:
- 编译期常量溢出(比如
int iii = 2147483650;):
你用的-Wall -Wextra -Werror组合并不包含检测编译期常量溢出的开关,得显式加上-Woverflow选项,GCC才会对这类编译期就能确定的有符号常量溢出触发警告(搭配-Werror就会变成编译错误)。 - 运行时变量运算溢出(比如
i+i,i值为2147483647):
这种属于动态运行时的溢出,静态编译器没法在编译期预判所有变量运算的溢出可能(除非是完全由常量组成的表达式),所以即使开了常用警告选项也检测不到。如果要监控这类溢出,要么自己写代码做边界判断,要么用GCC的-fsanitize=integer编译选项,让程序在运行时检测溢出并报错。
顺带提一句:GCC的警告选项是分模块的,-Wall和-Wextra只覆盖了常见的基础问题,很多严格的行为检测都需要手动指定对应的开关。
内容的提问来源于stack exchange,提问作者akaCroc
相关产品推荐
相关产品推荐

