2

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

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

根据我对strcpy 文档的阅读,我一直犹豫是否这样做,因为我认为相同的源和目标将被视为重叠。在 C++ 标准(或 C)中明确定义了重叠,这是否也包括相等性?

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

4

2 回答 2

0

既然您使用的是 C++,那么问题是,您为什么不使用std::string. strcpy是出了名的不安全(就像它的表亲strcpy_s和一样strncpy,尽管它们比 稍微安全一些strcpy)。

如果您尝试从相同的源复制到目标,则充其量您不会得到任何更改。

于 2013-09-10T19:23:25.483 回答
0

如果您发现自己是一个更好的 C 函数文档网站,您会看到以下签名:

char *strcpy(char *restrict s1, const char *restrict s2);

restrict在这种情况下表示调用者承诺所讨论的两个缓冲区不重叠。

我们可以进一步搜索从 C99 开始限制的含义,并找到这个维基百科页面

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

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

于 2013-09-10T20:03:35.283 回答