为什么 strcpy 从 Microsoft 支持重叠复制并带来潜在的泄漏风险
Why strcpy from Microsoft supports overlapped copying and bringing potential leak risk?
这是我的代码:
#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甚至可能使用或多或少与您相同的算法做(希望写得更干净),这纯粹是偶然的一个"有效",另一个不"有效"。 或者他们做某种优化,其中他们首先确定字符串长度,复制之前。 (如果您知道前面的长度,并且地址对齐,可以通过以下方式更快地复制复制单词,而不是字节。
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- 使用strcpy将char数组的元素复制到另一个数组
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- strcpy 在类中无法使用字符串指针
- Klocwork Inside的资源泄漏
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 有没有办法使用 strcpy 将字符串数组复制到另一个字符串或其他数组中?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 由 strcpy 设置的解除分配字符 * 时内存泄漏?
- 为什么 strcpy 从 Microsoft 支持重叠复制并带来潜在的泄漏风险
- 将在strcpy后删除[]导致内存泄漏