-2

这是我的代码:

#include <iostream>
#include <assert.h>
using namespace std;

char * my_strcpy(char *dst,const char *src)
{
    assert(dst != NULL);
    assert(src != NULL);
    char *ret = dst;
    while((* dst++ = * src++) != '\0');
    return ret;
}

int main()
{
    char str[4]="abc";
    cout<<str<<endl;
    strcpy(str+1,str); //works, "aabc" will be in it, \0 is out of its range
    cout<<str<<endl;
    my_strcpy(str+1,str); //an error will be occured here as expected
    cout<<str<<endl;
    return 0; 
} 

我的问题是,为什么微软的 strcpy 支持重叠复制并带来潜在的泄漏风险,即使 c++ 标准库声明 strcpy 不支持重叠场景?这种设计有什么优势吗?

谢谢!

4

2 回答 2

2

我认为微软开发人员只是决定不插入任何检查。该标准并没有说当用户尝试重叠复制时它必须中止。这意味着不进行检查会更便宜,因此不会进行检查。

C标准库通常比其他任何东西都更喜欢性能......

但是您可以尝试在启用运行时检查的情况下编译您的程序。这会在标准库函数和数据结构中插入额外的前置条件检查,并且可能会检测到此类问题。

另请参阅此 MSDN 文章:安全库:标准 C++ 库

于 2013-10-21T08:32:44.183 回答
1

是什么让您认为 Microsoft 版本正在运行。根据他们的文档:“如果源字符串和目标字符串重叠,则 strcpy 的行为是未定义的。” 您的代码也不会在这方面进行任何错误检查,如果字符串重叠,最终可能会出现未定义的行为。Microsoft 甚至可能使用与您或多或少相同的算法(希望写得更干净),而且很可能一个“有效”而另一个无效。或者他们进行某种优化,在复制之前首先确定字符串长度。(如果您预先知道长度,并且地址对齐,则可以通过复制字而不是字节来更快地复制。)

于 2013-10-21T08:51:40.307 回答