免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4171 | 回复: 23
打印 上一主题 下一主题

bool 陷井 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-03 17:45 |只看该作者 |倒序浏览
一个函数,明明返回假,可执行时却按真的路线执行,后来找到了问题所在,原来是bool的使用问题,下面这段代码可能没有问题,但是有隐患,因为函数返回的值只占用al,而如果判断时却用的语句为test eax, eax

  1. #include <stdio.h>

  2. #define false 0
  3. #define true 1

  4. typedef unsigned char bool;

  5. bool f(void)
  6. {
  7.         return false;
  8. }

  9. int main()
  10. {
  11.         if (f())
  12.                 printf("true\n");
  13.         else
  14.                 printf("false\n");
  15.         return 0;
  16. }


复制代码

论坛徽章:
0
2 [报告]
发表于 2006-08-03 17:46 |只看该作者
和编译器有关,所以大家一定要注意

论坛徽章:
0
3 [报告]
发表于 2006-08-03 18:02 |只看该作者
项目中关于布尔定义的好几个,最后我选择了枚举定义的比较好用

论坛徽章:
0
4 [报告]
发表于 2006-08-03 20:46 |只看该作者
原帖由 er 于 2006-8-3 17:45 发表
一个函数,明明返回假,可执行时却按真的路线执行,后来找到了问题所在,原来是bool的使用问题,下面这段代码可能没有问题,但是有隐患,因为函数返回的值只占用al,而如果判断时却用的语句为test eax, eax
[code]
#inc ...



你用的是啥编译器?

无论你的返回值是 char, short, 还是 int/long 型,返回值肯定是在 eax 中的!

要有说服力的话,就贴出汇编代码来

论坛徽章:
0
5 [报告]
发表于 2006-08-03 20:56 |只看该作者
不会吧。。。是呀,你有什么证据???

论坛徽章:
0
6 [报告]
发表于 2006-08-03 21:07 |只看该作者
我拿去编译了一下.. 结果是false
gcc-3.3
athlon64  -_-

论坛徽章:
0
7 [报告]
发表于 2006-08-04 10:06 |只看该作者
原帖由 mik 于 2006-8-3 20:46 发表



你用的是啥编译器?

无论你的返回值是 char, short, 还是 int/long 型,返回值肯定是在 eax 中的!

要有说服力的话,就贴出汇编代码来

我是在真实的项目中遇到的,这段代码如果拿gcc编译时,判断时用的test %al, %al,拿vc6编译是用的两行代码,
and         eax,0FFh
test        eax,eax
这样也没问题.但实际项目中(VC6编译),却没有and eax,0FFh这句,但是此时eax中的值却是0xCCCCCC00,因此会出错,不过当我用
if (f() == true)时,and eax,0FFh这句又会出现.我想我没必要骗大家,所以我觉得还是typedef enum{false, true} bool;这样定义比较好,而不是为了省空间而用typedef unsigned char bool

[ 本帖最后由 er 于 2006-8-4 10:08 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2006-08-04 10:10 |只看该作者
原帖由 er 于 2006-8-4 10:06 发表

我是在真实的项目中遇到的,这段代码如果拿gcc编译时,判断时用的test %al, %al,拿vc6编译是用的两行代码,
and         eax,0FFh
test        eax,eax
这样也没问题.但实际项目中(VC6编译),却没有and eax,0FF ...

能说一下"真实的项目"是什么环境吗,不然很难让我相信。
除非把true定义成-1了

论坛徽章:
0
9 [报告]
发表于 2006-08-04 10:14 |只看该作者
一个可能的情况是:

main()
没有看见f() 和bool的定义(比如在2个文件中)就会出现LZ说的

论坛徽章:
0
10 [报告]
发表于 2006-08-04 10:22 |只看该作者
gcc out:
       call    f
        testb   %al, %al
        je      .L3

VC out:
        call        _f
        and        eax, 255                                ; 000000ffH
        test        eax, eax
        je        SHORT $L774
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP