找回密码
 注册
搜索
查看: 1198|回复: 10

[讨论] 项目中看到的先人的代码.不是很明白.难道这是可以的吗.

[复制链接]
发表于 2007-2-2 14:34:32 | 显示全部楼层 |阅读模式
项目中看到的先人的代码.不是很明白.难道这是可以的吗.
先人是我现在使用平台的创始人,这样的代码规范吗?有什么样的危险吗?  
欢迎大家讨论.
//The original code has been replaced by me.

char * GetMsgBuf();
main()
{
char * pMsgBuf;
char * sTextBody;
...
sTextBody = (char *)malloc(100*sizeof(char));

...
pMsgBuf = GetMsgBuf();
if(pMsgBuf)
{
     strncpy(sTextBody,pMsgBuf,MAX_LEN);
}
  ...
}

char * GetMsgBuf()
{
      char MsgData[100];
      memset(MsgData, 0x00, MAX_MSG_DATA * sizeof(cahr));
      //process MsgData, for example:
      strcpy(MsgData, "How are you");
      ..
      return MsgData;     
}
 楼主| 发表于 2007-2-2 14:34:32 | 显示全部楼层 |阅读模式
项目中看到的先人的代码.不是很明白.难道这是可以的吗.
先人是我现在使用平台的创始人,这样的代码规范吗?有什么样的危险吗?  
欢迎大家讨论.
//The original code has been replaced by me.

char * GetMsgBuf();
main()
{
char * pMsgBuf;
char * sTextBody;
...
sTextBody = (char *)malloc(100*sizeof(char));

...
pMsgBuf = GetMsgBuf();
if(pMsgBuf)
{
     strncpy(sTextBody,pMsgBuf,MAX_LEN);
}
  ...
}

char * GetMsgBuf()
{
      char MsgData[100];
      memset(MsgData, 0x00, MAX_MSG_DATA * sizeof(cahr));
      //process MsgData, for example:
      strcpy(MsgData, "How are you");
      ..
      return MsgData;     
}
发表于 2007-2-2 16:53:20 | 显示全部楼层
GetMsgBuf函数有隐患啊,把栈内存的地址return出去,函数GetMsgBuf执行完,栈也就释放了。那MsgData指向的数据块,是危险的(别人可以更改的)。

老代码难免有不周的地方啦,看过WAP(TELECA外包的)代码,很多地方都没有对内存申请不到时的处理和保护。
点评回复

使用道具 举报

发表于 2007-2-2 19:04:33 | 显示全部楼层
通常情况下是没问题的,
因为在pMsgBuf = GetMsgBuf();之后马上就使用这部分数据,
如果没有中断(包含OS TICK TIMER中断)发生的话这部分数据是不会被更改的。
这么做的好处是速度快
(一方面是分配速度快因为给AUTO变量分配空间只是移动栈顶指针,
另一方面是不需要做任何释放的动作没有释放的开销),
另外不会产生堆内存碎片;
缺点是含有不确定性,一旦在使用完这部分数据前发生中断,
导致这部分数据被更改,那程序就可能出错了,
另外要保证分配和使用数据代码紧密相连,
中间不能有任何破坏这部分数据的操作(比如调用函数)。
哈,我是不会这么写的。[em15]
[此贴子已经被作者于2007-2-2 22:14:39编辑过]
点评回复

使用道具 举报

发表于 2007-2-2 16:53:20 | 显示全部楼层
GetMsgBuf函数有隐患啊,把栈内存的地址return出去,函数GetMsgBuf执行完,栈也就释放了。那MsgData指向的数据块,是危险的(别人可以更改的)。

老代码难免有不周的地方啦,看过WAP(TELECA外包的)代码,很多地方都没有对内存申请不到时的处理和保护。
点评回复

使用道具 举报

发表于 2007-2-2 19:04:33 | 显示全部楼层
通常情况下是没问题的,
因为在pMsgBuf = GetMsgBuf();之后马上就使用这部分数据,
如果没有中断(包含OS TICK TIMER中断)发生的话这部分数据是不会被更改的。
这么做的好处是速度快
(一方面是分配速度快因为给AUTO变量分配空间只是移动栈顶指针,
另一方面是不需要做任何释放的动作没有释放的开销),
另外不会产生堆内存碎片;
缺点是含有不确定性,一旦在使用完这部分数据前发生中断,
导致这部分数据被更改,那程序就可能出错了,
另外要保证分配和使用数据代码紧密相连,
中间不能有任何破坏这部分数据的操作(比如调用函数)。
哈,我是不会这么写的。[em15]
[此贴子已经被作者于2007-2-2 22:14:39编辑过]
点评回复

使用道具 举报

发表于 2007-2-7 13:26:20 | 显示全部楼层
这个code很有勇气啊。佩服
点评回复

使用道具 举报

发表于 2007-2-7 19:45:49 | 显示全部楼层
TELECA外包?是什么意思?
点评回复

使用道具 举报

发表于 2007-2-8 13:41:03 | 显示全部楼层
这样写是要出乱子的
点评回复

使用道具 举报

发表于 2007-2-9 16:16:06 | 显示全部楼层
char * GetMsgBuf()[52RD.com]
{[52RD.com]
      static char MsgData[100];[52RD.com]
      memset(MsgData, 0x00, MAX_MSG_DATA * sizeof(cahr));[52RD.com]
      //process MsgData, for example:[52RD.com]
      strcpy(MsgData, "How are you");[52RD.com]
      ..[52RD.com]
      return MsgData;     [52RD.com]
}

这样的话效果会好一点
点评回复

使用道具 举报

发表于 2007-2-9 20:07:45 | 显示全部楼层
<DIV class=quote><B>以下是引用<I>jordon</I>在2007-2-9 16:16:06的发言:</B>
char * GetMsgBuf()[52RD.com]
{[52RD.com]
      static char MsgData[100];[52RD.com]
      memset(MsgData, 0x00, MAX_MSG_DATA * sizeof(cahr));[52RD.com]
      //process MsgData, for example:[52RD.com]
      strcpy(MsgData, "How are you");[52RD.com]
      ..[52RD.com]
      return MsgData;     [52RD.com]
}

这样的话效果会好一点</DIV>

1) 浪费空间
2) 不适合多TASK调用
and more...
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-12-24 04:17 , Processed in 0.062973 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表