ProgSoft

A pessimist sees the difficulty in every opportunity; an optimist sees the opportunity in every difficulty.

用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
progsoft的公告
<div class="News"> <center><img src=http://blog.csdn.net/images/blog_csdn_net/progsoft/20346/o_Own.gif></center ><br> <center>朋友自远方来,不亦乐乎</center><br> <br> <div><B>个人简介</B></div> 网名:progsoft<br> QQ:49753255(此号被盗,也许永远申请不回来了:()<br> MAIL:<a href='mailto:progsoftAT163.com'>progsoftAT163.com</a><br><br> 来自:湖南长沙 <center> <hr size='1' width='100%'> 计数器<br> <script src="http://www.xcinfo.ha.cn/jsq/default.asp?User=progsoft&Length=6&x=15&y=20&Mode=002"></script> </center> <p><b>天气预报</b></p> <iframe width=150 height=240 frameborder=0 scrolling=NO src=http://appnews.qq.com/cgi-bin/news_qq_search></iframe> </div>
文章分类
MSN 论坛与协议
BOT2k3
Hypothetic
lanyus
存档

原创  VxWorks操作系统复位实战(四)[by Progsoft] 收藏

该死的While循环解析

现在能告诉我,你发现错误了么?

如果你已经发现错误,那么请跳过本文,本文对你不适用。

对照协议规定的文本看,该程序应该是没有错误啊,怎么回事呢?

协议、协议 -- 协 + 议,说明这个东东是可以讨价还价的,谁能保证所有的程序设计者在所有的细节上面都能保证和协议文本一致,且理解一致呢?且协议这个东西归根还是人制定了,谁能保证最先制定的时候没有缺陷呢?早期的C的规范文本不就有很多未规定项,导致如今编译器支持上面各自发挥的状态,大家应该都有深受其害的经历。

扯远了一点,归根到底是没有人能保证所有程序都能按照协议文本来工作,没人能保证在某种情况下内容被改写(当然应有其他手段,这里不描述)

只要一个简单实例问题就出来了。

usLen = 100

             TAG   LEN   CONT  TAG   LEN?
aucBuffer = {0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x02, ... }

很显然错误出在

usOffset += aucBuffer[usOffset + 1];
如果aucBuffer[usOffset + 1]=0,伟大的死循环就诞生了。

应该怎么做呢?针对本问题,我的推荐做法如下: 

usOffset = 0;
usCount  
= 0;
while (usOffset < usLen)
{
    
/* 记录TAG */
    MsgContent[usCount].Tag 
= aucBuffer[usOffset];
    
/* 记录该TAG的内容长度 */
    MsgContent[usCount].Len 
= aucBuffer[usOffset + 1];
    
/* 记录该TAG的地址,注意此处一般不会将内容拷贝出来,到实际使用的时候在取 */
    MsgContent[usCount].Content 
= usOffset;
    
/* 如果TAG长度小于最小的可能长度则跳出,解码失败 */
    
if (aucBuffer[usOffset + 1< 2)
    
{
        
break;
    }
    
    
/* 解码下一个TAG的偏移 */
    usOffset 
+= aucBuffer[usOffset + 1];
    
/* 记录TAG数目 */
    usCount
++;
}


if (usOffset < usLen)
{
    
return ERROR;
}

本文为了说明问题,代码都十分之简单,在编写的时候可能还会考虑到,但一旦代码复杂度增加N倍时,这些异常还能保证考虑到么?

该方法解决了死循环的问题。但是万无一失了么?请看下回。

发表于 @ 2007年01月21日 02:08:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:VxWorks操作系统复位实战(三)[by Progsoft]  | 新一篇:网卡物理地址和MAC地址的几点感想

  • 发表评论
  • 评论内容:
  •  
Copyright © progsoft
Powered by CSDN Blog