我明白那个strlcpy
and strlcat
被设计为安全替代品strncpy
and strncat
。但仍有一些人认为他们不安全,并且只会导致不同类型的问题 https://en.wikipedia.org/wiki/C_string_handling#Replacements.
有人可以举例说明如何使用strlcpy
or strlcat
(即一个函数alwaysnull 终止其字符串)会导致安全问题吗?
乌尔里希·德雷珀 (Ulrich Drepper) 和詹姆斯·安蒂尔 (James Antill) 表示这是正确的,但从未提供示例或澄清这一点。
首先,strlcpy
从未被设计为安全版本strncpy
(and strncpy
从未被设计为安全版本strcpy
)。这两个功能完全不相关。strncpy
是一个与 C 字符串(即以 null 结尾的字符串)完全无关的函数。事实是它有str...
其名称中的前缀只是一个历史错误。历史和目的strncpy
是众所周知且有据可查的。这是一个为处理 Unix 文件系统的某些历史版本中使用的所谓“固定宽度”字符串(不是 C 字符串)而创建的函数。如今,一些程序员对其名称感到困惑,并认为strncpy
不知何故应该作为有限长度的C字符串复制函数(一个“安全”的兄弟strcpy
),这实际上完全是无稽之谈,并导致糟糕的编程实践。当前形式的 C 标准库没有任何有限长度 C 字符串复制的功能。这是哪里strlcpy
适合。strlcpy
确实是一个真正的有限长度复制函数,为处理 C 字符串而创建。strlcpy
正确地完成了有限长度复制函数应该做的一切。人们可以针对它的唯一批评是,遗憾的是,它不是标准的。
第二,strncat
另一方面,它确实是一个与 C 字符串一起使用并执行有限长度连接的函数(它确实是strcat
)。为了正确使用此函数,程序员必须特别小心,因为此函数接受的大小参数实际上并不是接收结果的缓冲区的大小,而是其剩余部分的大小(也是终止符字符)是隐式计算的)。这可能会令人困惑,因为为了将该大小与缓冲区的大小联系起来,程序员必须记住执行一些额外的计算,这通常被用来批评strncat
. strlcat
解决这些问题,更改接口,以便不需要额外的计算(至少在调用代码中)。同样,我认为有人可以批评这一点的唯一依据是该功能不标准。另外,函数来自strcat
由于基于重新扫描的字符串连接这一概念的可用性有限,因此您在专业代码中不会经常看到 group 。
至于这些功能如何导致安全问题……他们根本不能。它们导致的安全问题不会比 C 语言本身“导致安全问题”更大。你看,很长一段时间以来,人们有一种强烈的情绪,认为 C++ 语言必须朝着发展成某种奇怪的 Java 风格的方向发展。这种情绪有时也会蔓延到 C 语言领域,导致对 C 语言特性和 C 标准库特性的相当无知和强迫的批评。我怀疑在这种情况下我们也可能会遇到类似的事情,尽管我当然希望事情没有那么糟糕。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)