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



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

使用GCC编译下面这个最简单的程序:P g[qc
/** 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);
}

运行结果:WAZ;B!Ob-x
[root@lknc souldump]# gcc -g -O3 -o demo demo.caL
R,W1JJ5q&x.I

[root@lknc souldump]# ./demo
%oJ*QX-\+}"S:Lrecvfrom error!Linux伊甸园论坛
jJVe
{hXH)`,~

: Invalid argument;R-O4Z(g1^/~
-1 bytes recivedLinux伊甸园论坛+K
K1X Tk PLn

recvfrom error!z?[
mH#y~U

: Invalid argument
7U
`f0n4j"cU;q;bwww.linuxeden.com
-1 bytes recivedLinux伊甸园论坛I,i!g&{
nqk"]2q)UOI

recvfrom error!&@M"W5c%D+c
: Invalid argument
c!O@)oHy-1 bytes recived

Z#Q^Y5{,BA
recvfrom error!
.u\xwkc: Invalid argumentw(u/|8eo0D@
-1 bytes recivedy#O3xaep7H
|%?,v6W"U

[root@lknc souldump]# gcc -g -o demo demo.cZ9}2[p:EI+u
[root@lknc souldump]# ./demowww.linuxeden.commIc:SF#Lj^8^
60 bytes recived
6s0H0?a:r$VU V@*}60 bytes recivedk+k:AlAMu H4`n

P n.H2J#~*xZ}[root@lknc souldump]# gcc -g -o demo demo.c
_]"S7Y$wLinux伊甸园论坛[root@lknc souldump]# ./demo}Fq8OP)c
60 bytes recived$d\&iCf9L;|C
60 bytes recived
*mZL;En1KZwww.linuxeden.comIB;GyfF
[root@lknc souldump]# gcc -g -O3 -o demo demo.c
5TU1^'p)v;Y5me ~%k[root@lknc souldump]# ./demo
2I        c$J#axQ nB7pCrecvfrom error!.s,N+Y-g2i#@zG| R
: Invalid argumentk/i%\*l;H
-1 bytes recived
O@7L$I i&gLinux伊甸园论坛recvfrom error!1m^.G
{4x)B*U0e

: Invalid argumentg8bZ,v%cVW
-1 bytes recivedOm.Nq h'w6hl

-`+z T M MK@#F1P使用-O3选项编译时会运行出错,提示参数错误,Linux伊甸园论坛e&[a [2lY:w$b g
是不是GCC在优化参数传递时有BUG,以前一直使用-O3选项编译,也没有问题,Linux伊甸园论坛S:`R}G!HZO
请高手指教。
yB!M$jBZuLinux伊甸园论坛,b3\"@;s$\        H*La9TX{
[ 本帖最后由 flag 于 2007-11-3 21:06 编辑 ]

顶部
不容错过的IBM 集群技术资源汇总
flag
版主
Rank: 7Rank: 7Rank: 7
版主



UID 19801
精华 1
积分 28(积分有什么用?)
帖子 5581
阅读权限 100
注册 2002-7-19
状态 离线
发表于 2007-11-5 10:19  资料  个人空间  短消息  加为好友 
可能是吧,下面是我在redhat 9上编译dump出的汇编
9tN-U@$Nx1\-A        qwww.linuxeden.com优化后的

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调用参数错误,或者是由于寄存器分配不合理,占用了别人的东西,

顶部
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 发表
`7v%t GM;i@)V/}W9awww.linuxeden.com你看看调用recvfrom时传递参数的情况,我感觉是编译器把地址弄错了,才导致recvfrom调用参数错误,或者是由于寄存器分配不合理,占用了别人的东西,

www.linuxeden.com:G)h PG3P)f9L
出现问题时首先怀疑的不应该是 gcc, 虽然 gcc 也难免有 bug, 但是人家毕竟已经很成熟了
t.{7A{U|!HNBsO
I}K

按照俺的理解, 问题应该出在 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;br,G*mzn F0k
我想到了,使用优化选项时这种未初始化的变量并不会立即分配空间,)gL:^.yv
因此会造成地址引用错误。

顶部
不容错过的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 发表 /D+u,U9w9A8PZ7U1IO
多谢版主提醒,Linux伊甸园论坛'N@6N$?&[H7b[{1G+g
我想到了,使用优化选项时这种未初始化的变量并不会立即分配空间,
LL1`%x){ kXjU因此会造成地址引用错误。

{MB3QJ:B,l
跟优化选项无关





'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
 



当前时区 GMT+8, 现在时间是 2008-5-17 06:06

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

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