当我在调试器中单步执行它时,我的程序表现出一些奇怪的行为.在下面的摘录中,它检查pktNum != ~invPktNum然后直接进行第二个return 1;语句.
调试器显示这pktNum是一个0x01 invPktNum的无符号字符,是一个0xFE的无符号字符.
/* Verify message integrity. */
if (pktNum != ~invPktNum) {
return 1;
}
ccrc = crc16_ccitt(msg, XModem_Block_Size);
if ( (((ccrc>>8) & 0xFF) != crcBuf[0])
|| ((ccrc & 0xFF) != crcBuf[1]) ) {
return 1;
}
Run Code Online (Sandbox Code Playgroud)
编译器已将这两种return 1情况折叠成完全相同的代码.两个if测试都分支到相同的汇编指令.每个指令只能用调试器的单个行号标记,因此您会看到这种奇怪的行为.如果你使用-g和不使用 -O(或者甚至更明确地使用-O0)进行编译,它将会产生不同的情况,事情会更清晰.
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |