如何将当前的 strcpy 转换为 strcpy_s?

son*_*pta 4 c string strcpy

我有一个strcpy到处都在使用的大型项目。我正在考虑使用strcpy_s而不是strcpy. 我想我已经使用了近 10,000 次strcpy。每次都换好麻烦strcpy。有什么有效的转换方法吗?

unw*_*ind 5

你真的不应该在没有检查的情况下这样做,因为如果不明智地完成,加强缓冲区管理的意义就消失了。

由于目标缓冲区的性质(例如静态或堆分配)在涉及 的正确参数时非常重要strcpy_s(),并且该信息当然不存在于现有strcpy()调用中,因此您必须以任何方式添加它。这需要一个人。

通常像这样的调用strcpy(dest, src);可以转换为strcpy_s(dest, sizeof dest, src);,但是如果dest是堆分配的,这将只是指针的大小而不是指向的缓冲区,这当然是错误的。

  • 为了进一步增加混淆,至少有一个 C++ 供应商 (MS) 提供了一个模板包装器,用于在使用声明的固定目标 `char` 数组(即 `char dst[N]; strcpy_s(dst, src) 时推断 `size_t` 参数) ;`)。因此,根据语言和供应商的不同,在这种用例中,用 `strcpy_s` 全面替换 `strcpy` 将可以正确编译,而将编译中断的地方作为 dest 参数的实际原始指针。我永远不知道该为此感谢他们还是诅咒他们。 (6认同)