免费注册 查看新帖 |

Chinaunix

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

是否可以视为GCC的bug [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-10 15:02 |只看该作者 |倒序浏览
while(k!=2){
        //cout <<k;
}
cout<<2;
如上一段代码把cout<<k注释掉后,就无法运行到cout<<2这句。在循环的地方就假死了。
其中k是由另外的线程来写入的。这个线程就是不断监测k的值达到2后进入下一步,但是。当把循环体中的打印语句取消注释后没有问题。
环境是ubuntu6.10下的g++ 4.1.2

论坛徽章:
0
2 [报告]
发表于 2008-06-10 15:03 |只看该作者
不懂。。。需要学习一下

论坛徽章:
0
3 [报告]
发表于 2008-06-10 15:04 |只看该作者
优化导致的吧,这时应该用volitale修饰k

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2008-06-10 15:16 |只看该作者
何止是 gcc 的 BUG,这是 gcc 的 BUG 正好碰上 Linux 的 BUG,
两个加在一起,恰巧把 intel CPU 的一个 BUG 给暴露出来了。

论坛徽章:
0
5 [报告]
发表于 2008-06-10 15:17 |只看该作者
原帖由 jigloo 于 2008-6-10 15:04 发表
优化导致的吧,这时应该用volitale修饰k

晕,把这茬忘了。。之前在cu上还看到大片相关讨论。。自以为理解了。。汗。。确实我是开了O2优化的,试试去。

论坛徽章:
0
6 [报告]
发表于 2008-06-10 15:20 |只看该作者
还有,貌似老大拼写错误
是volatile吧。。。。。。

论坛徽章:
0
7 [报告]
发表于 2008-06-10 15:22 |只看该作者
汗死,别提啥老大,小弟受宠若惊。

论坛徽章:
0
8 [报告]
发表于 2008-06-10 15:45 |只看该作者
这东西在C语言中是语言的组成部分,不是BUG

因为编译器对待
while(k != 2)
{
    ...
}
时,会根据{}里面的内容来编译while (k != 2)

还是看看代码
volatile.c:

int k = 1;
extern void fun();
int test()
{
        while (k != 2) {
                fun();
        }
}



        .file        "volatile.c"
        .text
        .p2align 4,,15
.globl test
        .type        test, @function
test:
        pushl        %ebp
        movl        %esp, %ebp
        subl        $8, %esp
        cmpl        $2, k
        je        .L5
        .p2align 4,,7
.L6:
        call        fun
        cmpl        $2, k
        jne        .L6
.L5:
        leave
        .p2align 4,,2
        ret
        .size        test, .-test
.globl k
        .data
        .align 4
        .type        k, @object
        .size        k, 4
k:
        .long        1
        .ident        "GCC: (GNU) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)"
        .section        .note.GNU-stack,"",@progbits



#cc -O2 -S volatile
#cat volatile.s




        .file        "volatile.c"
        .text
        .p2align 4,,15
.globl test
        .type        test, @function
test:
        movl        k, %eax
        pushl        %ebp
        movl        %esp, %ebp
        .p2align 4,,7
.L3:
        cmpl        $2, %eax/////////
        jne        .L3
        popl        %ebp
        ret
        .size        test, .-test
.globl k
        .data
        .align 4
        .type        k, @object
        .size        k, 4
k:
        .long        1
        .ident        "GCC: (GNU) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)"
        .section        .note.GNU-stack,"",@progbits






#cat volatile_2.c
int k = 1;
extern void fun();
int test()
{
        while (k != 2) {
                fun();
        }
}



#cc -O2 -S volatile_2.c
#cat volatile_2.s


                .file        "volatile.c"
                .text
                .p2align 4,,15
        .globl test
                .type        test, @function
        test:
                pushl        %ebp
                movl        %esp, %ebp
                subl        $8, %esp
                cmpl        $2, k
                je        .L5
                .p2align 4,,7
        .L6:
                call        fun
                cmpl        $2, k///////////
                jne        .L6
        .L5:
                leave
                .p2align 4,,2
                ret
                .size        test, .-test
        .globl k
                .data
                .align 4
                .type        k, @object
                .size        k, 4
        k:
                .long        1
                .ident        "GCC: (GNU) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)"
                .section        .note.GNU-stack,"",@progbits


可以看出,根据{}内容得到不同结果,至于什么时候生成什么结果,就是C标准里面规定的,可以参考一下
不过可以如果{}里面调用了一个可能会修改k的函数(比如fun,无论是否修改,编译的时候不知道,编译器只能假设会修改), 那么k将不能被优化

论坛徽章:
0
9 [报告]
发表于 2008-06-10 15:46 |只看该作者
cout最后会调用函数,不能保证这个函数不会修改K,所以K不能在while的时候被优化,自然就能得到另外一个线程的更新了

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
10 [报告]
发表于 2008-06-10 16:13 |只看该作者
原帖由 flw 于 2008-6-10 15:16 发表
何止是 gcc 的 BUG,这是 gcc 的 BUG 正好碰上 Linux 的 BUG,
两个加在一起,恰巧把 intel CPU 的一个 BUG 给暴露出来了。



这么挖苦人家
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP