在某些平台上证明strcpy
重叠的源地址和目标地址失败并不是很难,要么产生不正确的结果,要么陷阱(后者在Linux / amd64上有一些负的随机偏移)。
我为我们的代码库配备了strcpy
包装器函数,其中包含一个调试构建断言,用于检查这些重叠的副本,并收到了许多内部开发请求,以削弱此断言检查,以便它只会引发非零重叠的堕胎。
基于我对strcpy documentation的阅读,我一直犹豫不决,因为我认为相同的来源和目的地会被视为重叠。是否在C ++标准(或C)中明确定义了重叠,这是否也包含相等性?
我怀疑许多供应商strcpy
实现了特殊情况,尽管标准允许这种行为是自由的。是否有任何平台/硬件组合已知这种相同的副本失败?
答案 0 :(得分:0)
由于你使用的是C ++,问题是,你为什么不使用std::string
。众所周知strcpy
是不安全的(就像它的表兄strcpy_s
和strncpy
一样,虽然它们比strcpy
更温和一些。)
如果您尝试从源复制到目的地,那么最多只能进行更改。
答案 1 :(得分:0)
如果你发现自己有better documentation website个C函数,你会看到这个签名:
char *strcpy(char *restrict s1, const char *restrict s2);
在这种情况下, restrict
表示调用者承诺有问题的两个缓冲区不重叠。
我们可以进一步搜索C99的限制含义,并找到this wikipedia page:
它表示指针的生命周期,只有它或一个值 直接从它派生(如指针+ 1)将用于访问 它指向的对象。
很明显,不允许使用相同的指针。如果它恰好在您的系统上运行,那么您没有理由认为它将在下一次编译器,库或新硬件上运行。