我刚刚使用 IDA 对二进制文件进行了逆向工程,并加载了 Hex Ray 来检查特定的功能。生成的C源代码包含以下if语句:
LP_ret_GlobalLock_1 = GlobalLock(hMem);
LP_ret_GlobalLock_2 = LP_ret_GlobalLock_1;
...
if ( !LP_ret_GlobalLock_1 || (v9 = *(_DWORD *)(v6 + 4), *(_DWORD *)v6 = LP_ret_GlobalLock_2, v9 < 0) )
我不确定是否完全理解以下部分:
(v9 = *(_DWORD *)(v6 + 4), *(_DWORD *)v6 = LP_ret_GlobalLock_2, v9 < 0)
v9 初始化为 v6 + 4;但随后 v6 被修改为指针 LP_ret_GlobalLock_2,最后检查 v9 是否小于 0。这是正确的吗?计算 v9 时 v6 使用什么值? LP_ret_GlobalLock_2 还是之前的值?
最佳答案
我猜您是在问 comma operator 。它先计算逗号之前的表达式,然后计算逗号之后的表达式,整个结果就是第二个表达式的结果。
所以它首先是 v9 = *(_DWORD *)(v6 + 4)
,然后*(_DWORD *)v6 = LP_ret_GlobalLock_2
,然后 v9 < 0
。结果就是v9 < 0
的结果,在计算前两个表达式之后。
据我所知,您是通过逆向工程获得的。我自己编写代码时绝不会像这样在 if 语句中使用带有副作用的逗号运算符;太困惑了。
关于c - C 中的高级 IF 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1293057/