论坛: 编程破解 标题: 这个strcpy的实现是否有问题 复制本贴地址    
作者: sniper167 [sniper167]    论坛用户   登录
代码:

char *strcpy(char *des, const char *src)
{
      assert((des != NULL) && (src != NULL));
      char *add = des;
      while ((*des++ = *src++) != ‘\0’) ;
      return des;
}



我觉得应该是
代码:

char *strcpy(char *des, const char *src)
{
      assert((des != NULL) && (src != NULL));
      char *add = des;
      while ((*add++ = *src++) != ‘\0’) ;  //这里不同
      return des;
}



返回值应该是指向des那段空间开头,而不应该返回在copy过程中被改变的指针
大家认为呢

[此贴被 啥都不会(sniper167) 在 10月07日22时45分 编辑过]


[此贴被 啥都不会(sniper167) 在 10月07日22时47分 编辑过]

地主 发表时间: 06-10-07 22:44

回复: kert_t8 [kert_t8]   论坛用户   登录
如果第一段代码是正确的话,那
char *add = des;
这一句不是废话吗?但是我还是有点想不通为什么要return一个des的开头地址,开头地址是传入参数啊,调用的人难道不知道?

B1层 发表时间: 06-10-08 11:06

回复: sniper167 [sniper167]   论坛用户   登录
有道理
干嘛返回个des呢 
不是多此一举?

还是有其他什么作用?


B2层 发表时间: 06-10-08 15:08

回复: NetDemon [netdemon]   ADMIN   登录
这样做并非多此一举,这样使函数能够支持链式表达式,增加了函数的“附加值”。可以获得如下灵活性:
char str[20];
int length = strlen(strcpy(str, "Hello 20CN"));


B3层 发表时间: 06-10-08 18:23

回复: NetDemon [netdemon]   ADMIN   登录
Sorry ,刚才没看清楚,其实两个都是不对的,第二个不对得太离谱,不讨论,
第一个是返回值应该是add 而不是 des ,为什么要返回add刚刚已经解释了,
char *add = des;这句不是废话,相反while ((*add++ = *src++) != '\0') 这里的
!='\0'才是废话,因为表达式跟'\0'比较是多余的,问题仅仅在于表达式是否为0。
因此,正确的代码应该这样
代码:

char *strcpy(char *des, const char *src)
{     
      assert((des != NULL) && (src != NULL));
      char *add = des;
      while ((*des++ = *src++) ;
      return add;
}




附:UNIX上标准C库的strcpy()的源码
代码:

char *
strcpy(to, from)
        register char *to;
        register const char *from;
{
        char *save = to;

        for (; (*to = *from); ++from, ++to);
        return(save);
}



B4层 发表时间: 06-10-08 19:31

回复: NetDemon [netdemon]   ADMIN   登录
仔细想想,assert((des != NULL) && (src != NULL));这个更是废话
!='\0'都能咔嚓掉,这个就更要咔嚓掉了,因为如果assert会返回,即使没有这句废话,函数本身也会返回NULL,告诉你有毛病发生了。
而且assert只是个宏,除非你指定了DEBUG,不然的话很可能在编译的时候就给编译器给咔嚓掉了。

程序考虑各种有可能会发生的错误是正确的,但是,放屁脱掉裤子就费了自己的力气之外还加速了裤子的磨损,不值得提倡。

B5层 发表时间: 06-10-08 20:05

回复: sniper167 [sniper167]   论坛用户   登录
头儿
这段代码哪里错得离谱?
代码:

char *strcpy(char *des, const char *src)
{
      assert((des != NULL) && (src != NULL));
      char *add = des;
      while ((*add++ = *src++) != ‘\0’) ;  //这里不同
      return des;
}


还有下面这段代码
代码:

char *strcpy(char *des, const char *src)
{
      assert((des != NULL) && (src != NULL));
      char *add = des;
      while ((*des++ = *src++));  //这里是先判断*src是否为零还是先把*src赋值给*des呢?我理解的是先赋值在判断,这样copy后,才能保证des后面有结束符
      return add;
}



[此贴被 啥都不会(sniper167) 在 10月08日21时30分 编辑过]

B6层 发表时间: 06-10-08 21:23

回复: NetDemon [netdemon]   ADMIN   登录
错得离谱是指在这个特定的问题上错得离谱,而不是广义的意思

下面的你的理解是正确的,先赋值,然后加一,最后判断

B7层 发表时间: 06-10-08 21:55

回复: 286 [unique]   版主   登录
尽量不要用这个函数,现在很多入侵都是由这个函数造成了。

B8层 发表时间: 06-10-10 16:33

回复: NetDemon [netdemon]   ADMIN   登录
不能说是因为这个函数本身造成吧,我看是因为写程序的人造成,C本来就是那德性。

B9层 发表时间: 06-10-10 16:55

回复: sniper167 [sniper167]   论坛用户   登录
尽量不要用这个函数,现在很多入侵都是由这个函数造成
---------------------------------------------------
能说说这个函数怎么造成入侵吗
谢谢两位老大  感激不尽

另外ND说C就是那德行  是指C本身就有很多漏洞还是什么意思呢


B10层 发表时间: 06-10-10 21:22

回复: NetDemon [netdemon]   ADMIN   登录
C作为一种计算机语言,他本身不可能有所谓的漏洞
为什么用C/C++编写的应用程序运行起来通常比其他语言编写的快?
因为C/C++能够直接访问内存和计算机寄存器。
C/C++最具特色最具效率的指针,就直接的在内存中指来指去的。
也就因为这样的特性,决定了C/C++这样的语言不执行任何数组边界检查和任何类型安全检查。
一切要靠程序员来做,如果程序员不小心或者不够经验,很容易就会让缓冲区溢出。当然其他语言中也会出现缓冲区溢出,但很少见。如果出现这种错误,通常不是由程序员造成的,而是运行时环境的错误。
286说的很多入侵都是由这个函数造成,是因为很多的入侵都是因为缓冲区溢出而造成。

那么何以strcpy(),会造成缓冲区溢出呢?这是由程序员来决定的。
下面的程序有错吗?
代码:

void copydata(char *data) {
  char dest[8];
  strcpy(dest,data);
  // 对dest进行处理
  ...
}


这一定没错,你放任何编译器都能顺利编译顺利运行,但取决于你怎么用copydata().
如果是在这样:
char *src = "20cn";
copydata(src);
那这段代码是安全的,调用strcpy()永远都是安全的。
但如果copydata()的参数来自不可靠的源,比如一个打开的文件,或者一个用户的输入,或者是一个socket。那么就危险了。
strcpy将复制该数据,直到碰到空字符为止;如果此数据的长度大于8个字符,则
dest就溢出了。
比如 char *hack = "20cnsniper167286netdemon";
那么
copydata(hack);
就出问题了,尽管在程序上看来,它一点问题都没有。

[此贴被 NetDemon(netdemon) 在 10月10日23时31分 编辑过]

B11层 发表时间: 06-10-10 23:28

回复: NetDemon [netdemon]   ADMIN   登录
作为代替,有一个strncpy(),可以提供安全一点的操作,用第3个参数指定需要拷贝的长度。
但也不是绝对的安全,也还是要取决的程序员的脑子。因为这个主题是在讨论strcpy的实现
问题而不是安全问题,我就不多说了

B12层 发表时间: 06-10-10 23:42

回复: virgoshaka [virgoshaka]   论坛用户   登录
支持strncpy
好像现在有很多类似于strncpy的新函数出来

而且现在大部分的教科书都有这种废话的问题啊,照ND 说的,这些书都该被枪毙了 ,呵呵


[此贴被 处女座的沙加(virgoshaka) 在 10月12日02时30分 编辑过]

B13层 发表时间: 06-10-11 05:15

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号