C标准库的问题?

时间:2012-03-19 16:25:44

标签: c stdio standard-library std

我从各种来源读到C标准库中存在很多错误,问题和设计缺陷。一些与字符串处理功能有关,一些与I / O等有关。

这是真的吗?如果是这样,任何人都可以列出一些最常见的已知问题吗?

注意:我说的是 ISO C Library

3 个答案:

答案 0 :(得分:2)

ISO C90和C99中的最大问题可能是gets,它容易受到缓冲区溢出的影响。事实上,它似乎已从新的C11标准中删除。

获取临时文件tmpnam的ISO C函数容易受到多用户平台上的竞争条件的影响。 POSIX标准定义了一个更安全的函数mkstemp

此外,许多字符串函数(如strchr)都不是类型安全的;他们使用const char*但是将char*返回到同一缓冲区中,因此通过使用它们,您可以隐式地将const转换为gets。但是,避免这是一个仔细编程的问题; tmpnamstrcpy的字符串函数本身并不安全。

最后,strcatsprintfgets等许多函数都没有检查边界,但由于它们不像snprintf那样处理外部输入,所以可以以安全的方式使用。自C99起,sprintf是{{1}}的更安全的替代品。

答案 1 :(得分:2)

在我的脑海中,这里有一些已知的设计问题:

  1. 输入函数如gets(在C99中已弃用,在C11中消失,但仍然潜伏在上帝中,知道遗留代码的多少)scanf使用普通的%s转换说明符,等,可以超出目标缓冲区;

  2. 使用静态缓冲区在调用之间存储状态的strtok等函数,因此是不可重入的;

  3. 实施问题而言,我认为在大多数实施中,任何需要良好PRNG的人都不满意库存rand功能。

答案 2 :(得分:1)

您正在寻找的一些内容可以在rationale for TR-24731-1 "Extensions to the C Library Part I: Bounds-checking interfaces"中找到。

您是否同意TR24731-1如何解决这些问题,我认为这是对C标准库中许多问题的很好的概述。