- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我知道 strlcpy
和 strlcat
被设计为 strncpy
和 strncat
的安全替代品。然而,有些人仍然认为他们是insecure, and simply cause a different type of problem .
有人可以举例说明如何使用 strlcpy
或 strlcat
(即 总是 null 终止其字符串的函数)如何导致安全有问题吗?
Ulrich Drepper 和 James Antill 声明这是真的,但从未提供示例或澄清这一点。
最佳答案
首先,strlcpy
从未打算作为 strncpy
的安全版本(并且 strncpy
从未打算作为 strcpy
)。这两个功能完全无关。 strncpy
是一个与 C 字符串(即以 null 结尾的字符串)完全无关的函数。事实上,它的名称中有 str...
前缀只是一个历史错误。 strncpy
的历史和目的是众所周知的,并且有据可查。这是一个函数,用于处理在某些历史版本的 Unix 文件系统中使用的所谓“固定宽度”字符串(不是 C 字符串)。今天的一些程序员对其名称感到困惑,并假设 strncpy
在某种程度上应该用作有限长度的 C 字符串复制函数(strcpy
的“安全”兄弟),这实际上完全是胡说八道,会导致不良的编程习惯。当前形式的 C 标准库没有任何用于有限长度 C 字符串复制的功能。这就是 strlcpy
的用武之地。strlcpy
确实是为处理 C 字符串而创建的真正的有限长度复制函数。 strlcpy
正确地完成了有限长度复制函数应该做的所有事情。唯一可以针对它的批评是,很遗憾,它不是标准的。
其次,另一方面,strncat
确实是一个使用 C 字符串并执行有限长度连接的函数(它确实是 strcat< 的“安全”兄弟)/
)。为了正确使用这个函数,程序员必须特别小心,因为这个函数接受的大小参数实际上并不是接收结果的缓冲区的大小,而是它剩余部分的大小(还有终止符被隐式计算)。这可能会造成混淆,因为为了将该大小与缓冲区的大小联系起来,程序员必须记住执行一些额外的计算,这通常用于批评 strncat
。 strlcat
负责处理这些问题,更改接口(interface)以便不需要额外的计算(至少在调用代码中)。同样,我看到有人可以批评这一点的唯一依据是功能不标准。此外,strcat
组中的函数在专业代码中不会经常看到,因为基于重新扫描的字符串连接的想法的可用性有限。
至于这些功能如何导致安全问题......他们根本不可能。它们不会比 C 语言本身“导致安全问题”更严重地导致安全问题。你看,很长一段时间以来,有一种强烈的情绪认为 C++ 语言必须朝着发展成某种奇怪的 Java 风格的方向发展。这种情绪有时也会蔓延到 C 语言领域,导致对 C 语言特性和 C 标准库特性的相当无知和被迫的批评。我怀疑在这种情况下我们也可能正在处理类似的事情,尽管我当然希望事情并没有那么糟糕。
关于c - 为什么 strlcpy 和 strlcat 被认为是不安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2114896/
我无法修复一些遗留的 RAID 代码(是的,我拔了最短的稻草)。 这是我找到的一段代码。 #define FLAG_LENGTH 256 #code char str[FLAG_LENGTH-1] s
有了ft_strlcat我想重写srlcat。这是我目前所拥有的: #include size_t ft_strlcat(char *dest, const char *src, size_t n)
我知道 strlcpy 和 strlcat 被设计为 strncpy 和 strncat 的安全替代品。然而,有些人仍然认为他们是insecure, and simply cause a differ
我必须从标准 C 库实现我自己版本的 strlcat() 函数。 size_t strlcat(char * restrict dst, const char * restrict src,
我不明白为什么我们必须为 strlcat 和 strlcpy 返回一个 unsigned int,为什么我们需要那个?这不是该功能的目标。 感谢您的回复 最佳答案 这些函数的目的是(以某种方式)移动字
我正在尝试从 C 函数库重新创建我的 strlcat 函数。我在网上查了一下它是如何工作的。基本上,strlcat 允许将源字符串附加到以 NUL 结尾的目标字符串中。返回值必须是追加后的大小值。 简
我是一名优秀的程序员,十分优秀!