更安全的C标准库替代品

在I / O安全方面,C标准库非常差。 许多函数都有缓冲区溢出( getsscanf ),或者如果没有给出正确的参数( scanf ),就可能破坏内存,依此类推。 每隔一段时间,我就会遇到一个有进取心的黑客,他自己编写了一个缺乏这些缺陷的库。

你见过的这些图书馆有哪些最好的? 您是否在生产代码中使用过它们,如果是这样,那么它们不仅仅是业余爱好项目?

我使用GLib库,它有很多很好的标准和非标准function。

请参阅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模块的一部分,但也用于独立进程。

作为我所谈论的一个例子,DJ Bernstein,更为人所知的djb, djbdnsqmail作者,创建了djblib ,它为许多C标准库函数提供了快速,严密,安全的替代方案。

对于Windows,有一个“安全”的C / C ++库 。

也许第一个问题是你真的需要普通的C吗? (也许像.net或java这样的语言是一个选项 – 那么例如缓冲区溢出不再是一个问题)

另一种选择是,如果不能选择其他更高级别的语言,可以用C ++编写项目的一部分。 然后,如果您确实需要C,则可以使用C接口封装C ++代码。

因为如果你添加了C ++标准库所构建的所有高级函数 – 你的C代码大多数时候只会稍微快一些(并且包含比现有和测试框架更多的错误)。

您总是可以自由地实现您喜欢的任何库并使用它 – 困难的部分是确保它在您需要软件工作的平台上可用。 您还可以在适当的地方使用标准函数周围的包装器。

它是否真的是一个好主意有点值得商榷,但是C标准委员会发布了TR24731 – 用于更安全的C函数集。 那里肯定有一些好东西。 请参阅此问题: 您是否在C代码中使用TR 24731安全function? ,其中包括技术报告的链接。