标题: GCC -O3选项编译程序运行出错!是BUG?
souldump
小试牛刀
Rank: 2
注册用户



UID 126416
精华 0
积分 5(积分有什么用?)
帖子 153
阅读权限 10
注册 2005-7-9
状态 离线
发表于 2007-11-2 22:36  资料  个人空间  短消息  加为好友 
GCC -O3选项编译程序运行出错!是BUG?

使用GCC编译下面这个最简单的程序:Linux伊甸园论坛'E.C!B1V+bd$\6v&U*l0_
/** failure when compile with -O3 option.  why?? **/

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netpacket/packet.h>
#include <linux/if_ether.h>
#include <net/if.h>

int main()
{
        int n;
        int fd;
        unsigned char buff[2048];
        struct sockaddr_ll from;
        int socklen;

        fd = socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));

        while(1){
                n = recvfrom(fd , buff, 2047, 0, (struct sockaddr*)&from, &socklen);
                if (n < 0)
                        perror("recvfrom error!\n");
                printf("%d bytes recived\n", n);
        }
        close(fd);
}

运行结果:O$UF2q]+J
[root@lknc souldump]# gcc -g -O3 -o demo demo.c
+_T!Cf`RP ] j%}Linux伊甸园论坛[root@lknc souldump]# ./demo
y*O2U&?CPD,k:]
p
recvfrom error!
;QVpL/{&abaLinux伊甸园论坛: Invalid argumentLinux伊甸园论坛{5gE.@b#J%kC.}_
-1 bytes recived
q O8|,Hah4[recvfrom error!
4O f~1t.H8LqA(J*i: Invalid argumentLinux伊甸园论坛2OOp        l'jk[
-1 bytes recived
B4?,d Fi        ];i?;[
dwww.linuxeden.com
recvfrom error!
L jL3SS'Y&\+F[Linux伊甸园论坛: Invalid argumentV^'mMNww/[}X
-1 bytes recived
:f#r.L,M$\P_Linux伊甸园论坛recvfrom error!
$ViM,k;Py'cwww.linuxeden.com: Invalid argumentwww.linuxeden.com?PN9rS)s
-1 bytes recived
$}Q9F*K-]R[root@lknc souldump]# gcc -g -o demo demo.c
5{OBzi4cB[root@lknc souldump]# ./demo
        Ud?}#~'|~ \['C!K60 bytes recivedA$l1?%B-H7?
F:]3K$N

60 bytes recived
e:L9JVH ^p
]1s}"s-g)x]:QEgB[root@lknc souldump]# gcc -g -o demo demo.c
KJ8]^XWv
]*twww.linuxeden.com
[root@lknc souldump]# ./demo
/fT1B8oC?60 bytes recived
oBG
g8D:Z)Ez"qx
60 bytes recived
9I-~os}%y1{Lk#he
AZc9h.P8F1v[root@lknc souldump]# gcc -g -O3 -o demo demo.c
0BF6wTbF[root@lknc souldump]# ./demo
BC        L_Grecvfrom error!
4VDjo8_l9FiK*tw: Invalid argumentLinux伊甸园论坛4[V%x"Zg_8n
-1 bytes recived*i"~VIXL
recvfrom error!Linux伊甸园论坛%lR"\2n6@.nXS
: Invalid argument
)].h)Fb        xZ2bK9`N`1B-1 bytes recived
S{4L6g:SM`(mwww.linuxeden.com!D
}MI*sv

使用-O3选项编译时会运行出错,提示参数错误,Linux伊甸园论坛s}x(b'[;x{$V
是不是GCC在优化参数传递时有BUG,以前一直使用-O3选项编译,也没有问题,TKJrESLg_P
请高手指教。b3oU'] PO(H
`\1ImT%Ieb
c

[ 本帖最后由 flag 于 2007-11-3 21:06 编辑 ]

顶部
flag
版主
Rank: 7Rank: 7Rank: 7
版主



UID 19801
精华 1
积分 28(积分有什么用?)
帖子 5581
阅读权限 100
注册 2002-7-19
状态 离线
发表于 2007-11-5 10:19  资料  个人空间  短消息  加为好友 
可能是吧,下面是我在redhat 9上编译dump出的汇编
2z3^ t+LUq~M优化后的

8048496:        e8 9d fe ff ff               call   8048338 <recvfrom@plt>
804849b:        83 c4 20                     add    $0x20,%esp
804849e:        85 c0                        test   %eax,%eax
80484a0:        89 c3                        mov    %eax,%ebx
80484a2:        78 14                        js     80484b8 <main+0x70>
80484a4:        83 ec 08                     sub    $0x8,%esp
80484a7:        53                           push   %ebx
80484a8:        68 78 85 04 08               push   $0x8048578
80484ad:        e8 b6 fe ff ff               call   8048368 <printf@plt>
80484b2:        83 c4 10                     add    $0x10,%esp
80484b5:        eb c5                        jmp    804847c <main+0x34>
80484b7:        90                           nop   
80484b8:        83 ec 0c                     sub    $0xc,%esp
80484bb:        68 8a 85 04 08               push   $0x804858a
80484c0:        e8 83 fe ff ff               call   8048348 <perror@plt>
80484c5:        83 c4 10                     add    $0x10,%esp
80484c8:        eb da                        jmp    80484a4 <main+0x5c>

没优化的:

804849d:        e8 96 fe ff ff               call   8048338 <recvfrom@plt>
80484a2:        83 c4 20                     add    $0x20,%esp
80484a5:        89 45 f4                     mov    %eax,0xfffffff4(%ebp)
80484a8:        83 7d f4 00                  cmpl   $0x0,0xfffffff4(%ebp)
80484ac:        79 10                        jns    80484be <main+0x76> ;跳到80484be
80484ae:        83 ec 0c                     sub    $0xc,%esp
80484b1:        68 80 85 04 08               push   $0x8048580
80484b6:        e8 8d fe ff ff               call   8048348 <perror@plt>
80484bb:        83 c4 10                     add    $0x10,%esp
80484be:        83 ec 08                     sub    $0x8,%esp
80484c1:        ff 75 f4                     pushl  0xfffffff4(%ebp)
80484c4:        68 91 85 04 08               push   $0x8048591
80484c9:        e8 9a fe ff ff               call   8048368 <printf@plt>
80484ce:        83 c4 10                     add    $0x10,%esp
80484d1:        eb a8                        jmp    804847b <main+0x33>;继续循环

没优化的应该看的很清楚,优化的似乎有些看不明白。





上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。
顶部
souldump
小试牛刀
Rank: 2
注册用户



UID 126416
精华 0
积分 5(积分有什么用?)
帖子 153
阅读权限 10
注册 2005-7-9
状态 离线
发表于 2007-11-6 22:35  资料  个人空间  短消息  加为好友 
你看看调用recvfrom时传递参数的情况,我感觉是编译器把地址弄错了,才导致recvfrom调用参数错误,或者是由于寄存器分配不合理,占用了别人的东西,

顶部
不容错过的IBM 集群技术资源汇总
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 61(积分有什么用?)
帖子 4814
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 在线
发表于 2007-11-8 09:31  资料  个人空间  短消息  加为好友 


QUOTE:
原帖由 souldump 于 2007-11-6 22:35 发表 9\U,R
Z p^

你看看调用recvfrom时传递参数的情况,我感觉是编译器把地址弄错了,才导致recvfrom调用参数错误,或者是由于寄存器分配不合理,占用了别人的东西,

["f-poh2D出现问题时首先怀疑的不应该是 gcc, 虽然 gcc 也难免有 bug, 但是人家毕竟已经很成熟了 $^k3fc `.Vq6M%O

#[9B-[c,F;k+k'Bwww.linuxeden.com按照俺的理解, 问题应该出在 socklen 这个变量上, socklen 是个 value-result 参数, 你没有初始化就传给 recvfrom, 运气不好的话就会出错啦





'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
不容错过的IBM 集群技术资源汇总
souldump
小试牛刀
Rank: 2
注册用户



UID 126416
精华 0
积分 5(积分有什么用?)
帖子 153
阅读权限 10
注册 2005-7-9
状态 离线
发表于 2007-11-14 20:16  资料  个人空间  短消息  加为好友 
多谢版主提醒,www.linuxeden.com|ngt.}:[3l
我想到了,使用优化选项时这种未初始化的变量并不会立即分配空间,Linux伊甸园论坛rf(aq,y-l
因此会造成地址引用错误。

顶部
不容错过的IBM 集群技术资源汇总
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 61(积分有什么用?)
帖子 4814
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 在线
发表于 2007-11-15 11:13  资料  个人空间  短消息  加为好友 


QUOTE:
原帖由 souldump 于 2007-11-14 20:16 发表 Linux伊甸园论坛4P.@a;p y~9wd
多谢版主提醒,www.linuxeden.com4yK:y        vM3d.K/b
我想到了,使用优化选项时这种未初始化的变量并不会立即分配空间,nhG3dz@i
因此会造成地址引用错误。

]
t8lXIE#H
?
跟优化选项无关





'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
不容错过的IBM 集群技术资源汇总
 



当前时区 GMT+8, 现在时间是 2008-5-16 11:09

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.097031 second(s), 5 queries

清除 Cookies - 联系我们 - Linux伊甸园 - Archiver - WAP