- 论坛徽章:
- 15
|
本帖最后由 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语句会怎样操作指令,哪条指令会引起异常。
最后,给你开开眼:
一段连接池代码:- if(rs->Conn.Socket<0 || rs->cli.Errno<0) {
- ret=sc_connect(pl,rs);
- if(ret) {
- ShowLog(1,"%s:scpool[%d].%d 连接%s/%s错:err=%d,%s",
- __FUNCTION__,n,i,pl->log.HOST,pl->log.PORT,
- rs->cli.Errno, rs->cli.ErrMsg);
- rs->TCBno=-1;
- rs->cli.Errno=-1;
- pthread_mutex_lock(&pl->mut);
- add_lnk(pl,i);
- pthread_mutex_unlock(&pl->mut);
- return (T_Connect *)-1;
- }
- }
- 后边的:
- *connp=get_SC_connect(TCBno,poolno,1);
- if(*connp == (T_Connect *)-1) {
- *connp=NULL;
- return -1;
- }
复制代码 都是经过充分测试的代码,生产项目使用。
|
|