在诸如库之类的大型项目中使用atexit
存在固有的风险吗?
如果是这样,那么与atexit
背后的技术性质有何关系可能会导致在较大项目中出现问题?
atexit
的主要原因是任何使用它都会涉及全局状态。一个好的库应该避免拥有全局状态。实现只需要支持少量 (我想是32个) 的 atexit
处理器。超过这个数量后,所有对 atexit
的调用可能失败,或者成功或失败取决于资源可用性。因此,你必须处理如果无法注册你的 atexit
处理器时该怎么办,并且可能没有好的方法来继续执行。
atexit
与 dlopen
或其他动态加载库的方法的交互未被定义。已注册 atexit
处理器的库不能安全地被卸载,不同实现处理这种情况的方式可能会有所不同。
编写不良的 atexit
处理器可能会相互影响,或者只是产生糟糕的行为,从而阻止程序正确退出。例如,如果一个 atexit
处理器试图获取在另一个线程中持有的锁,并且由于在调用 exit
时的状态而无法释放该锁。
Secure CERT提到了atexit
的一个条目,当使用不正确时:
ENV32-C. 所有的atexit处理程序必须正常返回
atexit
的函数有可能调用 exit
或者不正常返回时,通常会出现问题? - Vilhelm Grayexit
的析构函数... - R.. GitHub STOP HELPING ICE