代码如下(windows):
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
int main()
{
int ival = 67;
if (send <= 78)
ival = 89;
printf("the ival is %d", ival);
return 0;
}
在上面的code里,很容易发现send这个变量没有声明,开始我认为这段code应该不能被编译,但是在.c的文件可以编译通过。 但是在.cpp文件编译不过。
察看汇编代码如下:
.....
if (send <= 78)
cmp dword ptr [__imp__send@16 (1C8388h)], 4Eh
ja main+35h (1C1AB5h)
.....
原来send这个变量被编译器认为是socket函数库里的send函数了。而函数名本身就是一地址,汇编代码就是读取这个地址指向的内容与78作比较。
我认为是这仅仅是VS2008的问题,所以我把这code 放到GCC 4.5.2下测试。
察看汇编代码如下:
mov $0x8048328, %eax
cmp $0x4e, %eax
ja 0x8048417 <main+35>
这与VS2008一致。
但是,如果我把code改为
int main()
{
int ival = 67;
if (send <= 0)
ival = 89;
printf("the ival is %d", ival);
return 0;
}
这段code的汇编代码为:
movl $0x43, 0x1c(%esp) -> 这是ival=67
mov $0x80484c0, %eax -> 下面的汇编code为printf函数调用做准备。
mov 0x1c(%esp), %edx
....
由此分析,感觉if (send <= 0)没有被编译。
而这样的code 在VS2008下,编译为cmp dword ptr [__imp__send@16 (1C8388h)], 0。
非常有意思的code。