第三道嵌入式系统功夫题

[复制链接]
5505|39
 楼主| djyos 发表于 2008-2-27 11:18 | 显示全部楼层 |阅读模式
char&nbsp;*buf;<br />函数verify用于校验buf中头4个字节的内容是不是'ABCD'4个字符<br />bool&nbsp;verify(char&nbsp;*buf)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;a=0x44434241;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;((*(uint32&nbsp;*)buf)&nbsp;==&nbsp;a);<br />}<br />要求函数verify能在各种嵌入式环境中移植。<br />问题:<br />1、verify函数正确吗?<br />2、在什么环境下是正确的?<br />3、在什么环境下是不正确的?<br />如果第3个问题列举两类或以上环境,说明你已经有嵌入式开发的中级功力了。<br /><br />补充:<br />好像高手们都不屑于研究此类问题,但这可不同于奇技淫巧,它可有效降低产品中潜在的bug,尤其对于嵌入式操作系统或者中间件的作者,意义非凡,你总是希望自己写的操作系统或者中间件能够适应更多的CPU!
computer00 发表于 2008-2-27 11:22 | 显示全部楼层

大小端问题

  
 楼主| djyos 发表于 2008-2-27 11:25 | 显示全部楼层

圈圈加油

“如果第3个问题列举两类或以上环境,说明你已经有嵌入式开发的中级功力了。”<br />看仔细了,两类以上,你已经答对了一类了。
dld2 发表于 2008-2-27 11:29 | 显示全部楼层

对齐问题。

  
 楼主| djyos 发表于 2008-2-27 11:31 | 显示全部楼层

dld2加油

又答对一类,看还有没有继续的?
sz_kd 发表于 2008-2-27 12:04 | 显示全部楼层

呵呵,学习了

  
HWM 发表于 2008-2-27 16:38 | 显示全部楼层

毫无价值,从软件工程的角度来看一堆垃圾。

连基本的可读性和可理解性都不符,更不用说可移植性了。<br />LZ:嵌入式系统功夫如果在于你所出的那些题也太误导人,太可笑了。还是早些罢了,踏踏实实地埋头看些书干些实事吧。<br />
 楼主| djyos 发表于 2008-2-27 17:18 | 显示全部楼层

7楼上不要太武断

&nbsp;&nbsp;&nbsp;&nbsp;这个问题是从一个资深工程师所犯的错误中抽象出来的,而且错误果然作为一个bug潜伏在产品中,运行若干年后爆发,花了巨多的钱才搞定。原来的代码太长,这段代码是临时捏的,可读性是差了点,但还能看懂,不是吗?<br />&nbsp;&nbsp;&nbsp;&nbsp;所以,这绝不是茴字写法的问题。我出的这几道题,都是从别人(还好,不是我)犯过的错误中抽象出来的,有些错误还是造成了巨大损失的。这些东西是从实际工作中发现的,书上好像没有。<br />第一道题的错误原型:有人函数内数组溢出导致母函数局部变量被修改,并戏称发现了一个修改母函数局部变量的方法。<br />第二道题的错误原型:有一linux熟手(他自认为高手)非要用uclinux做实时应用。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;这几天比较闲,上坛子兴风作浪来了。
HWM 发表于 2008-2-27 19:09 | 显示全部楼层

所以,我说这是一堆垃圾没错啊。

  
 楼主| djyos 发表于 2008-2-27 19:40 | 显示全部楼层

垃圾论者,如果你不认为错误是正确之母的话……

吸取错误的教训,可以不犯同样错误。<br />升华并研究错误,可以不犯同类错误。
HWM 发表于 2008-2-27 19:52 | 显示全部楼层

问题是这错误太低级,更和所谓的“嵌入式系统功夫”无关

甚至于都不能称之为错误,简直是概念混淆。
sinanjj 发表于 2008-2-27 20:03 | 显示全部楼层

有了第一道题的功底, 试着答一下

分析,&nbsp;<br /><br />先把基本理论写上:&nbsp;<br />int&nbsp;*p;&nbsp;   &nbsp;p为指向整型量的指针变量<br />int&nbsp;*p[n];&nbsp;  p为指针数组,&nbsp;由n个指向整型量的指针元素组成。<br />int&nbsp;(*p)[n];&nbsp; p为指向整型二维数组的指针变量,&nbsp;二维数组的列数为n<br />int&nbsp;*p()&nbsp;   p为返回指针值的函数,&nbsp;该指针指向整型量<br />int&nbsp;(*p)()&nbsp;  p为指向函数的指针,&nbsp;该函数返回整型量<br />int&nbsp;**p&nbsp;   &nbsp;p为一个指向另一指针的指针变量,该指针指向一个整型量<br />标识符右边的方括号和圆括号优先于标识符左边的&quot;*&quot;号,&nbsp;而方括号和圆括号以相同的优先级从左到右结合.&nbsp;<br /><br />阅读组合说明符的规则是&quot;从里向外&quot;:&nbsp;从标识符开始,&nbsp;先看它右边有无方括号或园括号,&nbsp;如有则先作出解释,&nbsp;再看左边有无*号.&nbsp;如果在任何时候遇到了闭括号,&nbsp;则在继续之前必须用相同的规则处理括号内的内容.&nbsp;例如:<br />int&nbsp;*(*(*a)())[10];<br />↑&nbsp;↑↑↑↑↑↑<br />7&nbsp;&nbsp;6&nbsp;4&nbsp;2&nbsp;1&nbsp;3&nbsp;5<br />上面给出了由内向外的阅读顺序,&nbsp;下面来解释它:<br />(1)标识符a被说明为;<br />(2)一个指针变量,&nbsp;它指向;<br />(3)一个函数,&nbsp;它返回;<br />(4)一个指针,&nbsp;该指针指向;<br />(5)一个有10个元素的数组,&nbsp;其类型为;<br />(6)指针型,&nbsp;它指向;<br />(7)int型数据.<br />因此a是一个函数指针变量,&nbsp;该函数返回的一个指针值又指向一个指针数组,&nbsp;该指针数组的元素指向整型量.<br /><br />
sz_kd 发表于 2008-2-27 20:05 | 显示全部楼层

还是支持楼主,做老师应该 心态平和点啊

  
sinanjj 发表于 2008-2-27 20:09 | 显示全部楼层

接续分析

return&nbsp;((*(uint32&nbsp;*)buf)&nbsp;==&nbsp;a);<br />(*(uint32&nbsp;*)buf)<br />*(uint32&nbsp;*)buf<br />可以看出,&nbsp;是把buf强制成指向uint32的指针.&nbsp;然后又取值.<br /><br />好,&nbsp;可以答题了.<br />1、verify函数正确吗?<br />一定环境下正确(不用分析也知道..)<br />2、在什么环境下是正确的?<br />答:&nbsp;1,&nbsp;传递的buf指向的值是4的倍数,&nbsp;不然就溢出.<br />&nbsp;&nbsp;2,&nbsp;....<br /><br />djyos&nbsp;前辈公布答案啊
sinanjj 发表于 2008-2-27 20:11 | 显示全部楼层

顺便问一下第2道题呢?

这两天没来,&nbsp;不知第道题在什么地方
mohanwei 发表于 2008-2-27 20:12 | 显示全部楼层

同感,连数组都可以溢出,谈其它显然是未走先飞了

  
HWM 发表于 2008-2-27 20:14 | 显示全部楼层

看了12楼更是无语,服了。呵呵,该我罢了。

  
sinanjj 发表于 2008-2-27 20:23 | 显示全部楼层

给HWM的一点意见

这些内容都是我收集了好久的,&nbsp;是实际中遇到的,&nbsp;不然我也不总结这玩意.<br /><br />如果你看linux得源代码的话,&nbsp;你会看到很多这玩意,&nbsp;比这复杂的还有.<br /><br />&quot;从软件工程的角度来看一堆垃圾&quot;&nbsp;<br /><br />现在软件模块化,&nbsp;快速化,&nbsp;确实是这样的,&nbsp;但是对底层编程,&nbsp;用C,&nbsp;特别是看高手的C程序,&nbsp;这些知识还是需要的,&nbsp;不然,&nbsp;无法成长为顶级的高手
HWM 发表于 2008-2-27 20:27 | 显示全部楼层

再次无语!

  
sinanjj 发表于 2008-2-27 20:31 | 显示全部楼层

那请HWM发表一些实质性的意见

比如,&nbsp;您认为该如何处理该问题呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

454

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部