C中的高级IF语句

Ben*_*min 2 c if-statement

我只是使用IDA反向设计二进制文件并加载Hex Ray以检查特定功能.generate 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) )
Run Code Online (Sandbox Code Playgroud)

我不确定完全理解以下部分:

(v9 = *(_DWORD *)(v6 + 4), *(_DWORD *)v6 = LP_ret_GlobalLock_2, v9 < 0)
Run Code Online (Sandbox Code Playgroud)

v9初始化为v6 + 4; 但是后来v6被修改为指针LP_ret_GlobalLock_2,最后v9检查是否小于0.这是正确的吗?在计算v9时,v6使用了什么值?LP_ret_GlobalLock_2或之前的值?

Jes*_*per 5

我想你问的是逗号运算符.它在逗号之前计算表达式,然后在逗号之后计算表达式,整个事物的结果是第二个表达式的结果.

所以它首先做v9 = *(_DWORD *)(v6 + 4),然后*(_DWORD *)v6 = LP_ret_GlobalLock_2,然后v9 < 0.v9 < 0在评估前两个表达式之后,结果是结果.

我知道你是通过逆向工程得到的.我永远不会在if语句中使用带有副作用的逗号运算符,就像我自己编写代码一样; 它太混淆了.