为什么 strcpy 从 Microsoft 支持重叠复制并带来潜在的泄漏风险

Why strcpy from Microsoft supports overlapped copying and bringing potential leak risk?

本文关键字:泄漏 strcpy Microsoft 支持 复制 重叠 为什么      更新时间:2023-10-16

这是我的代码:

#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++) != '');
    return ret;
}
int main()
{
    char str[4]="abc";
    cout<<str<<endl;
    strcpy(str+1,str); //works, "aabc" will be in it,  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 来自 Microsoft 支持重叠复制并带来潜在的泄漏风险,即使认为声明的 strcpy 的 c++ 标准库不支持重叠场景? 这种设计有什么优势吗?

谢谢!

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

C 标准库通常更青睐性能而不是其他任何东西......

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

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

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