这是受到这个问题和对一个特定答案的评论的启发,因为我了解到这strncpy
在 C 中不是一个非常安全的字符串处理函数,并且它会填充零,直到达到n
,这是我不知道的。
具体来说,引用R..
strncpy 不会以空值终止,而是对目标缓冲区的整个剩余部分进行空值填充,这是对时间的巨大浪费。您可以通过添加自己的空填充来解决前者,但不能解决后者。它从未打算用作“安全字符串处理”功能,而是用于处理 Unix 目录表和数据库文件中的固定大小字段。snprintf(dest, n, "%s", src) 是标准 C 中唯一正确的“安全 strcpy”,但它可能会慢很多。顺便说一句,截断本身可能是一个主要错误,并且在某些情况下可能会导致特权提升或 DoS,因此抛出“安全”字符串函数来截断其输出并不是一种使其“安全”或“安全的”。反而,
来自乔纳森·莱弗勒
请注意,strncat() 的接口比 strncpy() 更令人困惑——这个长度参数到底是什么?根据您提供的 strncpy() 等,这不是您所期望的 - 所以它甚至比 strncpy() 更容易出错。对于复制字符串,我越来越认为有一个强有力的论点是你只需要 memmove() 因为你总是提前知道所有的大小并确保提前有足够的空间。使用 memmove() 优先于 strcpy()、strcat()、strncpy()、strncat()、memcpy() 中的任何一个。
所以,我显然对 C 标准库有点生疏了。因此,我想提出一个问题:
哪些 C 标准库函数使用不当/可能导致/导致安全问题/代码缺陷/效率低下?
为了客观起见,我有一些答案标准:
- 如果可以的话,请引用相关功能背后的设计原因,即其预期目的。
- 请突出显示代码当前被滥用的地方。
- 请说明为什么这种滥用会导致问题。我知道这应该很明显,但它会阻止软答案。
请避免:
- 关于函数命名约定的辩论(除非这明确引起混淆)。
- “我更喜欢 x 而不是 y” - 偏好是可以的,我们都有它们,但我对实际的意外副作用以及如何防范它们感兴趣。
由于这可能被认为是主观的并且没有明确的答案,因此我立即标记为社区 wiki。
我也在按照 C99 工作。