我从不同的来源了解到C标准库中有很多错误、问题和设计缺陷。有些与字符串处理函数有关,有些与I/O等有关。
这是真的吗?如果是的话,有人能列出一些最常见的问题吗?
注意:我指的是ISO C库。
发布于 2012-03-19 16:37:32
下面是几个已知的设计问题:
gets (在C99中不推荐,在C11中消失,但仍然潜伏在天知道有多少遗留代码中),scanf使用普通的%s转换说明符等,可以超出目标缓冲区;strtok )是不可重入的;至于实现问题,我不认为需要一个好的rand函数的人会对大多数实现中的库存PRNG函数感到满意。
发布于 2012-03-19 16:28:51
ISO C90和C99中最大的问题可能是gets,它容易受到缓冲区溢出的影响。事实上,它似乎已经从新的C11标准中删除了。
用于获取临时文件tmpnam的ISO函数易受多用户平台上的争用条件的影响。POSIX标准定义了一个更安全的函数mkstemp。
此外,许多字符串函数(如strchr )都不是类型安全的;它们接受一个const char*,但将一个char*返回到同一个缓冲区中,因此通过使用它们,您可以隐式地丢弃const。然而,避免这一点是一个谨慎的编程问题;字符串函数本质上并不像gets和tmpnam那样不安全。
最后,许多函数(如strcpy、strcat和sprintf )不进行边界检查,但由于它们不像gets那样处理外部输入,所以可以安全地使用它们。snprintf是自C99以来相对于sprintf更安全的替代方案。
发布于 2012-03-19 16:33:15
您正在寻找的一些内容可以在TR-24731-1“C库第I部分:边界检查接口的扩展”的基本原理中找到。
不管您是否同意TR24731-1试图解决这些问题的方式,我认为这是C标准库中许多问题的一个很好的概要。
https://stackoverflow.com/questions/9773920
复制相似问题