BBS.ChinaUnix.net
今日推荐    首页 | 新闻 | Linux | AIX | 博客 | 论坛 | 存储 | 人才 | 培训 | 知识库 | 资料 | 读书 | 手册 | 精华 | 下载 | 空间     
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


aix中,变量怎么会这样?
首页 » 论坛 » C/C++ »  
[打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]
system888net   帅哥
光明使者




UID:304970
注册:2005-8-21
最后登录: 2008-07-07
帖子:765
精华:1

可用积分:836
信誉积分:100
专家积分:30 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
21楼 发表于 2008-5-8 18:30 


QUOTE:
原帖由 safedead 于 2008-5-8 18:28 发表
以前在C/C++看过一篇关于字符串常量的老生常谈文字
据说AIX默认允许覆盖字符串常量

比如
char *a = "abcd";
char *b = "efgh";
strcpy(a, b);
是允许的

如果真的是这样
移植起来就会要人命

说得对,是这样的.



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
system888net   帅哥
光明使者




UID:304970
注册:2005-8-21
最后登录: 2008-07-07
帖子:765
精华:1

可用积分:836
信誉积分:100
专家积分:30 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
22楼 发表于 2008-5-8 18:39 


QUOTE:
原帖由 safedead 于 2008-5-8 18:28 发表
以前在C/C++看过一篇关于字符串常量的老生常谈文字
据说AIX默认允许覆盖字符串常量

比如
char *a = "abcd";
char *b = "efgh";
strcpy(a, b);
是允许的

如果真的是这样
移植起来就会要人命

说得对,因此对于一个好的程序员来说,编码的良好习惯非常重要.
在strcpy(a,b) 前做一下越界检查,虽然不是高的技巧,但可使移植的代码很快发现一些隐患.
比较有争议的帖子<使C程序比较健壮的良好习惯示例>讲的就是这个思想,当然也不绝对,总之取决与最终的目标!



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
ivhb   帅哥
大天使



UID:177152
注册:2004-8-15
最后登录: 2008-07-07
帖子:2120
精华:0

可用积分:5
信誉积分:295
专家积分:5 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
23楼 发表于 2008-5-9 10:34 


QUOTE:
原帖由 safedead 于 2008-5-8 18:28 发表
以前在C/C++看过一篇关于字符串常量的老生常谈文字
据说AIX默认允许覆盖字符串常量

比如
char *a = "abcd";
char *b = "efgh";
strcpy(a, b);
是允许的

如果真的是这样
移植起来就会要人命

编译时候指定 -qro 就可以



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
marxn
侠客




UID:524777
注册:2007-1-31
最后登录: 2008-07-02
帖子:39
精华:0

可用积分:44
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
24楼 发表于 2008-5-9 20:38 
会不会溢出是编译器决定的,跟AIX有什么关系



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
sanbiangongzi
圣骑士
公子



UID:622714
注册:2007-9-28
最后登录: 2008-06-20
帖子:145
精华:0

可用积分:140
信誉积分:0
专家积分:4 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
25楼 发表于 2008-5-9 22:19 
void foo()
{
   char b[5];
   strcpy(b,"Hello,Aix");
   printf("b is %s",b);
}

int main()
{
   foo();
   return 0;
}

这样试一下,
字符串应该就会覆盖到返回低地址了

[ 本帖最后由 sanbiangongzi 于 2008-5-9 22:25 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

青山相待 白云相爱
梦不到紫罗袍共黄金带
一矛斋   野花开
管甚谁家兴衰谁成败
陋巷单瓢亦乐哉

贫 气不改 达 志不改



CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
sanbiangongzi
圣骑士
公子



UID:622714
注册:2007-9-28
最后登录: 2008-06-20
帖子:145
精华:0

可用积分:140
信誉积分:0
专家积分:4 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
26楼 发表于 2008-5-9 22:34 
上面的错了,理论上会覆盖返回地址,但是gcc的编译器通常会自作多情。比如
#include <stdio.h>

void foo(void)
{
   char b[5];
   
   strcpy(b,"Hello,Aix");
   printf("b is %s",b);
}

int main(int argc, char *argv[])
{
   foo();

   return 0;
}
对应的汇编是:
        .file        "a.c"
        .text
LC0:
        .ascii "Hello,Aix\0"
LC1:
        .ascii "b is %s\0"
.globl _foo
        .def        _foo;        .scl        2;        .type        32;        .endef
_foo:
        pushl        %ebp
        movl        %esp, %ebp
        subl        $24, %esp;b只有5个字节却要分给他24个字节的保留空间;而其当我把5改成25后,这里的24变成了40
        subl        $8, %esp
        pushl        $LC0
        leal        -24(%ebp), %eax
        pushl        %eax
        call        _strcpy
        addl        $16, %esp
        subl        $8, %esp
        leal        -24(%ebp), %eax
        pushl        %eax
        pushl        $LC1
        call        _printf
        addl        $16, %esp
        leave
        ret
        .def        ___main;        .scl        2;        .type        32;        .endef
.globl _main
        .def        _main;        .scl        2;        .type        32;        .endef
_main:
        pushl        %ebp
        movl        %esp, %ebp
        subl        $8, %esp
        andl        $-16, %esp
        movl        $0, %eax
        movl        %eax, -4(%ebp)
        movl        -4(%ebp), %eax
        call        __alloca
        call        ___main
        call        _foo
        movl        $0, %eax
        leave
        ret
        .def        _printf;        .scl        2;        .type        32;        .endef
        .def        _strcpy;        .scl        2;        .type        32;        .endef


因为栈sp指针的东西总是要是4的倍数的,所以我把第12行的$24改成了$8之后,编译这个汇编文件的到的可执行文件输出是:
C:\EP_Backup>a
b is ?@
C:\EP_Backup>

我实在WindowsXP 上用MingW带的gcc编译的



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

青山相待 白云相爱
梦不到紫罗袍共黄金带
一矛斋   野花开
管甚谁家兴衰谁成败
陋巷单瓢亦乐哉

贫 气不改 达 志不改



CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
hyyuanqiang
禁止访问-骑士




UID:661530
注册:2008-1-10
最后登录: 2008-05-19
帖子:55
精华:0

可用积分:53
信誉积分:0
专家积分:0 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
27楼 发表于 2008-5-10 20:21 
*** 作者被禁止或删除 内容自动屏蔽 ***
yangdon323   帅哥
侠客




UID:272033
注册:2005-5-24
最后登录: 2008-06-26
帖子:48
精华:0

可用积分:49
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
28楼 发表于 2008-5-11 19:39 
定义字符数组时,我也验证过几种unix系统(包括linux)都会按4的倍数分配空间。
但是写出这样的代码,说明还是新新新手



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-07-07
帖子:1695
精华:3

可用积分:2346
信誉积分:100
专家积分:10 (本版)

来自:成都
状态:...保密...

[个人空间] [短信] [博客]


顶部
29楼 发表于 2008-5-11 19:56 


QUOTE:
原帖由 chenzhanyiczy 于 2008-5-8 14:55 发表
假设一个上几万行得程序,虽然有这个bug,但测试时,都是输出正确得结果,那没可能还要一个个去检查吧

我告诉你这种BUG怎么调。
当你的系统出现异常的时候,用调试器从出错的地方一个函数一个函数的往前跟,你会最终会发现在有一点上某个内存地址的值异常了。在这个地址上停一个写断点。重新运行你的程序,当溢出覆盖到这个地址时,写断点就停住了,你就可以找到溢出的地方。
不仅是几万行的程序,上百万行的程序也是这么调的。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
MackedNice (好好学习)
风云使者



UID:140976
注册:2004-3-10
最后登录: 2008-06-10
帖子:447
精华:0

可用积分:281
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[个人空间] [短信] [博客]


顶部
30楼 发表于 2008-5-11 22:30 


QUOTE:
原帖由 zx_wing 于 2008-5-11 19:56 发表

我告诉你这种BUG怎么调。
当你的系统出现异常的时候,用调试器从出错的地方一个函数一个函数的往前跟,你会最终会发现在有一点上某个内存地址的值异常了。在这个地址上停一个写断点。重新运行你的程序,当溢 ...

这个方法真是不错。还没有试过这样调试的。以后可以试试!



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布

首页 » 论坛 » C/C++ »


 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.057201 second(s), 4 queries , Gzip enabled