我从各种来源读到C标准库中存在很多错误,问题和设计缺陷。一些与字符串处理功能有关,一些与I / O等有关。
这是真的吗?如果是这样,任何人都可以列出一些最常见的已知问题吗?
注意:我说的是 ISO C Library 。
答案 0 :(得分:2)
ISO C90和C99中的最大问题可能是gets
,它容易受到缓冲区溢出的影响。事实上,它似乎已从新的C11标准中删除。
获取临时文件tmpnam
的ISO C函数容易受到多用户平台上的竞争条件的影响。 POSIX标准定义了一个更安全的函数mkstemp
。
此外,许多字符串函数(如strchr
)都不是类型安全的;他们使用const char*
但是将char*
返回到同一缓冲区中,因此通过使用它们,您可以隐式地将const
转换为gets
。但是,避免这是一个仔细编程的问题; tmpnam
和strcpy
的字符串函数本身并不安全。
最后,strcat
,sprintf
和gets
等许多函数都没有检查边界,但由于它们不像snprintf
那样处理外部输入,所以可以以安全的方式使用。自C99起,sprintf
是{{1}}的更安全的替代品。
答案 1 :(得分:2)
在我的脑海中,这里有一些已知的设计问题:
输入函数如gets
(在C99中已弃用,在C11中消失,但仍然潜伏在上帝中,知道遗留代码的多少)scanf
使用普通的%s
转换说明符,等,可以超出目标缓冲区;
使用静态缓冲区在调用之间存储状态的strtok
等函数,因此是不可重入的;
就实施问题而言,我认为在大多数实施中,任何需要良好PRNG的人都不满意库存rand
功能。
答案 2 :(得分:1)
您正在寻找的一些内容可以在rationale for TR-24731-1 "Extensions to the C Library Part I: Bounds-checking interfaces"中找到。
您是否同意TR24731-1如何解决这些问题,我认为这是对C标准库中许多问题的很好的概述。