免费注册 查看新帖 |

Chinaunix

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

[C] 这个函数里面的if() 是不是写的太罗嗦了? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2013-07-23 11:09 |只看该作者
asdf2110 发表于 2013-07-19 15:07
1.  static 变量只初始化一次,所以第2,3,。。。,n次进入函数时,p的指向就是 buffer + n 了
2.  参考1 ...


5楼的说法正确,补充1:  static char buffer[1024];//是比malloc分配内存更理想的方式,申请释放由编译器和系统处理;也比全局变量分配方式更能限定作用域。这种应用场景在C语言环境下,还是比较理想。
              补充2: if (p + size >= buffer + sizeof (buffer))   abort ();//用于防止no_prefix(..)函数被超出次数调用,也防止strcpy内存访问出错。因为在函数注释中有"allocated off static storage at Wget startup."  ,调用函数上下文对函数调用环境做了限定。同时这个函数不是线程安全的, 当然注释中显示在wget startup使用,应该是单线程环境。

论坛徽章:
0
22 [报告]
发表于 2013-07-23 11:25 |只看该作者
按六楼说的“ 标准要求指针的加减法得到的结果必须仍指向数组元素或数组最后一个元素之后的第一个位置,否则是未定义行为”:
7 楼的用法蛮好:
buffer + sizeof(buffer) - p > size

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
23 [报告]
发表于 2013-07-23 13:39 |只看该作者
本帖最后由 yulihua49 于 2013-07-23 17:03 编辑
pmerofc 发表于 2013-07-22 21:51
武断
你怎么知道“从没问题”?
本版就有人因为这个错误在产品升级时出现过问题

7楼那个很好,但是相对原式只是代数变换,并无实质不同。
你怎么证明原来错误?
如果原来错误,你又有什么高招避免该错误?
wget已经是实用的了,除了线程不安全,有别的错吗?


再重复一次,指针,只要不访问其内容,指向任何位置都没问题。
最简单的证明:
if(point == NULL) 。。。。最常用的了吧,一旦point==NULL,该语句有错吗?
更极端的用法:
point=(char *)-1L;
if(-1 == (long)point) {//千万别用*point
。。。。
没有问题。请放心使用。
它的潜在风险是,后边的代码如果只是进行这个判决:
if(point != NULL) {
        // 使用了*point
就出轨了。
但凡这种用法,一定会有一个使用说明:
返回值:
point==NULL,非致命错误;
point==-1,致命错误。

你说出的那个问题,一定是在某处用到那个内容才出的错。

关键是你不懂汇编,不知道C语句会怎样操作指令,哪条指令会引起异常。

最后,给你开开眼:
一段连接池代码:
  1.         if(rs->Conn.Socket<0 || rs->cli.Errno<0) {
  2.                 ret=sc_connect(pl,rs);
  3.                 if(ret) {
  4.                         ShowLog(1,"%s:scpool[%d].%d 连接%s/%s错:err=%d,%s",
  5.                                 __FUNCTION__,n,i,pl->log.HOST,pl->log.PORT,
  6.                                 rs->cli.Errno, rs->cli.ErrMsg);
  7.                         rs->TCBno=-1;
  8.                         rs->cli.Errno=-1;
  9.                         pthread_mutex_lock(&pl->mut);
  10.                         add_lnk(pl,i);
  11.                         pthread_mutex_unlock(&pl->mut);
  12.                         return (T_Connect *)-1;
  13.                 }
  14.         }

  15. 后边的:

  16. *connp=get_SC_connect(TCBno,poolno,1);
  17.         if(*connp == (T_Connect *)-1) {
  18.                 *connp=NULL;
  19.                 return -1;
  20.         }

复制代码
都是经过充分测试的代码,生产项目使用。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
24 [报告]
发表于 2013-07-23 15:54 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
25 [报告]
发表于 2013-07-23 16:57 |只看该作者
本帖最后由 yulihua49 于 2013-07-23 16:59 编辑
pmerofc 发表于 2013-07-23 15:54
回复 23# yulihua49

好吧,你对了。
7楼的程序没问题。
我赶紧检查了所有的程序,有类似需求,还真没有这种用法。
幸亏。
目前那些程序安全。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP