4

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

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

4

2 回答 2

6

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

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

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

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

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

于 2013-06-27T19:10:51.503 回答
1

Secure CERT 有一个关于atexit何时未正确使用的条目:

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

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

于 2013-06-27T18:15:27.077 回答