一段可爱的C语言的code, 难以发现的bug

代码如下(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。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值