atexit被认为有害吗?

时间:2013-06-27 18:09:45

标签: c c99 atexit

在大型项目(如图书馆)中使用atexit是否存在固有的危险?

如果是这样,atexit背后可能导致大型项目出现问题的技术性质是什么?

2 个答案:

答案 0 :(得分:5)

我避免在库中使用atexit的主要原因是它的任何使用都涉及全局状态。一个好的图书馆应该避免拥有全球状态。

但是,还有其他技术原因:

  1. 实现只需要支持少量(我认为是32位)atexit处理程序。之后,所有对atexit的调用都可能失败,或者它们成功或失败,具体取决于资源可用性。因此,如果您无法注册atexit处理程序,则必须处理该怎么做,并且可能没有任何好的方法可以继续。

  2. 未定义atexitdlopen或其他动态加载库的方法的交互。已注册atexit处理程序的库无法安全卸载,不同实现处理此情况的方式可能会有所不同。

  3. 写得不好的atexit处理程序可能会相互交互,或者只是不良行为,从而阻止程序正常退出。例如,如果一个atexit处理程序试图获取一个在另一个线程中持有的锁,并且由于当时exit被调用而无法释放。

答案 1 :(得分:1)

如果使用不当,安全CERT的条目大约为atexit

ENV32-C。所有atexit处理程序必须正常返回

https://www.securecoding.cert.org/confluence/display/seccode/ENV32-C.+All+atexit+handlers+must+return+normally