在I / O安全方面,C标准库非常差。许多函数都有缓冲区溢出(gets
,scanf
),或者如果没有给出正确的参数(scanf
)可能会破坏内存,依此类推。每隔一段时间,我就遇到一个有创业能力的黑客,他自己编写了一个缺乏这些缺陷的图书馆。
您见过的这些图书馆最好的是什么?您是否在生产代码中使用过它们,如果是这样,那么它们不仅仅是业余爱好项目?
答案 0 :(得分:8)
我使用 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()函数类似但更安全,因为它计算所需的最大空间并分配内存来保存结果。
答案 1 :(得分:4)
这并没有真正回答你关于最安全的库的问题,但是你提到的大多数易受缓冲区溢出攻击的函数都有更安全的版本,它们以缓冲区长度作为参数来防止使用标准方法时打开的安全漏洞。
除非您放宽了警告级别,否则在使用弃用方法时通常会收到编译器警告,建议您使用更安全的方法。
答案 2 :(得分:3)
作为我所说的一个例子,D.J。 Bernstein,更为人所知的是djb,djbdns
和qmail
的作者,创建了djblib
,它为许多C标准库函数提供了快速,严密,安全的替代方案。
答案 3 :(得分:3)
我相信Apache Portable Runtime (apr)库比标准C库更安全。我使用它,作为apache模块的一部分,但也用于独立进程。
答案 4 :(得分:2)
对于Windows,有一个'safe' C/C++ library。
答案 5 :(得分:0)
也许要问的第一个问题是你真的需要普通的C吗? (也许像.net或java这样的语言是一种选择 - 那么例如缓冲区溢出就不再是问题了)
另一种选择可能是用C ++编写项目的一部分,如果不能选择其他更高级别的语言。然后,如果您确实需要C,则可以使用C接口封装C ++代码。
因为如果你添加了C ++标准库内置的所有高级函数 - 你的C代码大多数时候会稍微快一点(并且包含比现有和测试框架更多的错误)。
答案 6 :(得分:0)
你总是可以自由地实现你喜欢的任何库并使用它 - 困难的部分是确保它在你需要软件工作的平台上可用。您还可以在适当的时候使用标准函数周围的包装器。
这是否真的是一个好主意有点值得商榷,但是C标准委员会发布了TR24731 - 用于更安全的C函数集。那里肯定有一些好东西。请参阅此问题:Do you use the TR 24731 Safe Functions in your C code?,其中包含技术报告的链接。