免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cdphp
打印 上一主题 下一主题

今天遇到的一个极品指针问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-01-02 21:40 |只看该作者
原帖由 xfly_t 于 2008-1-2 10:38 发表

你写的程序试过没?



请把我的话看仔细点, 我说编译链接都不应该有问题

我没说在linux-x86上运行不会有问题!

你知道编译链接和运行有什么区别么? 仔细想想


你执行  gcc a.c 没出任何错,就说明编译链接没有问题。

但是在linux-x86上运行这个应用程序就会崩溃, 知道为什么么?
我写了2个示范代码,一个是应用程序的,一个是内核模块的。 你试过我写的内核模块没有? 年轻人,请看话看仔细点

论坛徽章:
0
22 [报告]
发表于 2008-01-02 21:53 |只看该作者
oops... what a man...

论坛徽章:
0
23 [报告]
发表于 2008-01-02 22:05 |只看该作者
原帖由 beilian 于 2008-1-2 21:53 发表
oops... what a man...


These kids are all amateurish and I can't draw myself up......

论坛徽章:
0
24 [报告]
发表于 2008-01-02 22:08 |只看该作者

回复 #18 fallshuang 的帖子

我真想骂你一句裘千仞.
你真的在2.6内核中试了你那个内核模块吗?
char *str = "aaaa";
*str = 'b';
这个语句能将str[0]的值变为'b'吗?
你试试再说话.

很简单的一个问题, 就是一个进程的地址空间的权限问题, 你非要弄个什么内核模块出来. 还骂这骂那的, 看不惯不同的意见.

论坛徽章:
0
25 [报告]
发表于 2008-01-02 22:22 |只看该作者
原帖由 scutan 于 2008-1-2 22:08 发表
我真想骂你一句裘千仞.
你真的在2.6内核中试了你那个内核模块吗?
char *str = "aaaa";
*str = 'b';
这个语句能将str[0]的值变为'b'吗?
你试试再说话.

很简单的一个问题, 就是一个进程的地址空间的权 ...

agree...
From C99 - 6.4.5 String literals
6   It is unspecified whether these arrays are distinct provided their elements have the appropriate values.  If the program attempts to modify such an array, the behavior is undefined.

论坛徽章:
0
26 [报告]
发表于 2008-01-03 09:27 |只看该作者
原帖由 scutan 于 2008-1-2 22:08 发表
我真想骂你一句裘千仞.
你真的在2.6内核中试了你那个内核模块吗?
char *str = "aaaa";
*str = 'b';
这个语句能将str[0]的值变为'b'吗?
你试试再说话.

很简单的一个问题, 就是一个进程的地址空间的权 ...



你看话请看仔细点,年轻人不要激动。我只说执行那个内核模块不会出错,我没说缺省的内核配置

char *str = "aaaa";
*str = 'b';

这个语句能将str[0]的值变为'b!

但是,如果你经常debug kernel的话,你就会很清楚在什么样的kernel上这2段代码会将str[0]的值变位'b' 。  这是debug kerenl的基本常识之一。

==================================
只要修改kernel的配置,使rodata可写
char *str = "aaaa";
*str = 'b';
这2句代码就可以在内核里修改字符串常量了。 知道该改内核哪个地方么?


我的意思就一个:
char *str = "aaaa";
*str = 'b';

这样的代码是符合ISO C99语法规范的。

这个问题其实很简单,就是rodata的权限问题,但是2楼的那位居然说这2句代码编译应该报错,这是不对的。 我主要是反对2楼的观点,但是很多人都不仔细看我说的话。
最好仔细看完别人说的话再发表意见。

btw: 我很想知道我那句话是骂人的脏话,谢谢赐教。

[ 本帖最后由 fallshuang 于 2008-1-3 09:49 编辑 ]

论坛徽章:
0
27 [报告]
发表于 2008-01-03 09:55 |只看该作者
这个问题其实很简单,就是rodata的权限问题,但是2楼的那位居然说这2句代码编译应该报错,这是不对的。 我主要是反对2楼的观点,但是很多人都不仔细看我说的话。
最好仔细看完别人说的话再发表意见。


也不知道你是没有“最好仔细看完别人说的话再发表意见。”,还是故意装作没看见。我已经解释过了我之所以说一楼的例子编译会报错是因为里面用到了未定义的变量 test。当然,这肯定是楼主没有把他的原始代码copy上来的,而是重新输入了一份,导致了这个笔误。因此我还特意加了个

至于说真正的错误,以及什么时候会报错相信大家包括楼主自己都知道吧,毕竟这也不是什么高深问题。犯不着牛皮哄哄的又是“规范”,又是“内核”的吧。

ps. LZ 千万别改一楼的帖子呀,要不然我就说不清了

[ 本帖最后由 lgfang 于 2008-1-3 09:57 编辑 ]

论坛徽章:
0
28 [报告]
发表于 2008-01-03 10:16 |只看该作者
原帖由 lgfang 于 2008-1-3 09:55 发表


也不知道你是没有“最好仔细看完别人说的话再发表意见。”,还是故意装作没看见。我已经解释过了我之所以说一楼的例子编译会报错是因为里面用到了未定义的变量 test。当然,这肯定是楼主没有把他的原始代码 ...


回头看了下,没注意到你re的帖子,呵呵。  

主要去re 14和24楼的帖子了

论坛徽章:
0
29 [报告]
发表于 2008-01-03 11:00 |只看该作者

回复 #28 fallshuang 的帖子



不管怎么样,还是从你那学了一招

论坛徽章:
0
30 [报告]
发表于 2008-01-03 13:47 |只看该作者
原帖由 fallshuang 于 2008-1-3 09:27 发表



你看话请看仔细点,年轻人不要激动。我只说执行那个内核模块不会出错,我没说在缺省的内核配置上

char *str = "aaaa";
*str = 'b';

这个语句能将str[0]的值变为'b!

但是,如果你经常debug ker ...

本来都没看这个帖子的,觉得这个问题被说了无数次,没有什么新意,但没想到还会引出争论。
看了兄台的发言和各位的回复,觉得大家说的都没错,但有几点疑惑想请教一下。
首先,这个程序符合语法,不会有编译错误,那肯定是对的,兄台和大家说的都没错。
其次,str被放在了.rodata段,也是对的,没有异议。

再其次, whyglinux说的也是正确的,确是运行时发生的错误。至于后来兄台回复的一大段话,我就补充一句,应用程序编译后就已确定加载的位置,不会发生relocation,所以兄台提到relocation和load的区别,感觉和主题扯远了。当然,我相信这个你是知道的,我只是补充。

最后,来看看兄台提到的.rodata段在内核中的问题。
兄台提到某种情况下编译那段代码,运行可以不出错。虽然我不知道如何编译,但理论上当然是可以做到的,只要让.rodata在页表里有写权限就可以了。请教了朋友,也看了kernel的config文件,我还是没找到打开的选项。后来朋友指点了我一下,我想你说的应该是这个东西:CONFIG_DEBUG_RODATA, 不知对否。

在x86平台下(其它平台下该函数不一定被实现了),init/main.c中init函数中,调用了mark_rodata_ro()函数,该函数的作用是将.rodata段在页表中的属性设置成只读,去掉它,.rodata段就可写了。它受CONFIG_DEBUG_RODATA宏控制。

我知道兄台是想论述,修改常量字符串不是在任何情况下都会出错,但不管怎样,这种用法除了在某些特定环境下(例如debug)外,都是不对的。无论内核还是应用程序。

[ 本帖最后由 zx_wing 于 2008-1-3 13:49 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP