C 标准库在 I/O 安全方面出了名的差。许多函数都有缓冲区溢出(gets
, scanf
),或者如果没有给出正确的参数(scanf
)会破坏内存,等等。每隔一段时间,我就会遇到一个有进取心的黑客,他编写了自己的库,但没有这些缺陷。
你见过的最好的图书馆是什么?你有没有在生产代码中使用过它们,如果有的话,这不仅仅是业余项目吗?
我使用GLib库,它有很多很好的标准和非标准函数。
见https://developer.gnome.org/glib/stable/
也许你坠入爱河...... :)
例如:
https://developer.gnome.org/glib/stable/glib-String-Utility-Functions.html#g-strdup-printf
解释说g_strdup_printf是:
类似于标准 C sprintf() 函数,但更安全,因为它计算所需的最大空间并分配内存来保存结果。
这并没有真正回答您关于使用最安全库的问题,但是您提到的大多数易受缓冲区溢出影响的函数都有更安全的版本,这些版本将缓冲区长度作为参数,以防止标准时打开的安全漏洞使用的方法。
除非您放宽了警告级别,否则在使用不推荐使用的方法时通常会收到编译器警告,建议您改用更安全的方法。
我相信Apache Portable Runtime (apr)库比标准 C 库更安全。我将它用作 apache 模块的一部分,但也用于独立进程。
对于 Windows,有一个“安全”的 C/C++ 库。
你总是可以自由地实现你喜欢的任何库并使用它——困难的部分是确保它在你需要你的软件工作的平台上可用。您还可以在适当的情况下使用标准函数周围的包装器。
Whether it is really a good idea is somewhat debatable, but there is TR24731 published by the C standard committee - for a safer set of C functions. There's definitely some good stuff in there. See this question: Do you use the TR 24731 Safe Functions in your C code?, which includes links to the technical report.
也许要问的第一个问题是您是否真的需要纯 C 语言?(也许像 .net 或 java 这样的语言是一种选择 - 然后例如缓冲区溢出不再是一个真正的问题)
如果不能选择其他高级语言,另一种选择可能是用 C++ 编写项目的一部分。然后,如果您真的需要 C,您可以拥有一个封装 C++ 代码的 C 接口。
因为如果您添加 C++ 标准库内置的所有高级功能 - 您的 C 代码在大多数情况下只会稍微快一些(并且包含比现有和经过测试的框架更多的错误)。