CSAPP DataLab中isLessOrEqual错误实现因编译器优化异常求助
CSAPP DataLab isLessOrEqual函数编译优化导致的异常问题
我是计算机科学初学者,正在通过CSAPP学习相关知识(以下代码基于32位环境编译)。在完成CSAPP实验DataLab的bits.c时,我写出了isLessOrEqual函数的错误实现——实验检查器仅允许使用! ~ & ^ | + << >>运算符:
int isLessOrEqual(int x, int y) { int a = y + (~x + 1); return !(a >> 31); }
我清楚这个实现存在错误:当x=0x80000000(TMIN,32位有符号整数最小值)、y=0x7fffffff(TMAX,32位有符号整数最大值)时,理论上函数应返回0,但它却通过了btest测试(结果为1)。我插入printf打印日志后得到了异常结果:
日志输出显示a>>31=0xffffffff,但!(a>>31)=1、!!(a>>31)=1,而单独计算!0xffffffff的结果应该是0。更奇怪的是,将这段代码复制到新文件编译时,却返回了正确的0。
经朋友用IDA分析发现,编译器直接将代码优化为:
_BOOL4 __cdecl isLessOrEqual(int a1, int a2) { if ( a1 == 0x80000000 && a2 == 0x7FFFFFFF ) { // 固定打印日志内容 } return a2 >= a1; }
我测试不同编译选项后发现:使用gcc -m32 -O编译时返回1,仅用gcc -m32编译时返回0。想请教为何会出现这种异常结果?
内容的提问来源于stack exchange,提问作者Kuristra
相关产品推荐
相关产品推荐

