是strcpy在哪里严格定义src == dest?

时间:2013-09-10 19:01:49

标签: c++ overlap strcpy

在某些平台上证明strcpy重叠的源地址和目标地址失败并不是很难,要么产生不正确的结果,要么陷阱(后者在Linux / amd64上有一些负的随机偏移)。

我为我们的代码库配备了strcpy包装器函数,其中包含一个调试构建断言,用于检查这些重叠的副本,并收到了许多内部开发请求,以削弱此断言检查,以便它只会引发非零重叠的堕胎。

基于我对strcpy documentation的阅读,我一直犹豫不决,因为我认为相同的来源和目的地会被视为重叠。是否在C ++标准(或C)中明确定义了重叠,这是否也包含相等性?

我怀疑许多供应商strcpy实现了特殊情况,尽管标准允许这种行为是自由的。是否有任何平台/硬件组合已知这种相同的副本失败?

2 个答案:

答案 0 :(得分:0)

由于你使用的是C ++,问题是,你为什么不使用std::string。众所周知strcpy是不安全的(就像它的表兄strcpy_sstrncpy一样,虽然它们比strcpy更温和一些。)

如果您尝试从源复制到目的地,那么最多只能进行更改。

答案 1 :(得分:0)

如果你发现自己有better documentation website个C函数,你会看到这个签名:

char *strcpy(char *restrict s1, const char *restrict s2);
在这种情况下,

restrict表示调用者承诺有问题的两个缓冲区不重叠。

我们可以进一步搜索C99的限制含义,并找到this wikipedia page

  

它表示指针的生命周期,只有它或一个值   直接从它派生(如指针+ 1)将用于访问   它指向的对象。

很明显,不允许使用相同的指针。如果它恰好在您的系统上运行,那么您没有理由认为它将在下一次编译器,库或新硬件上运行。