【发布时间】:2013-06-27 18:09:44
【问题描述】:
在图书馆等大型项目中使用atexit 是否存在固有危险?
如果是这样,atexit 背后的技术性质是什么可能导致大型项目出现问题?
【问题讨论】:
在图书馆等大型项目中使用atexit 是否存在固有危险?
如果是这样,atexit 背后的技术性质是什么可能导致大型项目出现问题?
【问题讨论】:
我避免在库中使用atexit 的主要原因是它的任何使用都涉及全局状态。一个好的库应该避免拥有全局状态。
不过,还有其他技术原因:
实现只需要支持少量(我认为是 32 个)atexit 处理程序。之后,对atexit 的所有调用都可能失败,或者它们成功或失败取决于资源可用性。因此,如果您无法注册您的 atexit 处理程序,您必须处理该怎么办,并且可能没有任何好的方法可以继续。
atexit 与 dlopen 的交互或其他动态加载库的方法未定义。已注册 atexit 处理程序的库无法安全卸载,不同的实现处理这种情况的方式可能会有所不同。
写得不好的atexit 处理程序可能会相互交互,或者只是不良行为,从而阻止程序正确退出。例如,如果atexit 处理程序尝试获取另一个线程中持有的锁,并且由于调用exit 时的状态而无法释放。
【讨论】:
man atexit。但是,我不确定是否在其他 C 库上强制执行相同的行为。因此,如果您只针对 glibc,这不适用于您。
安全 CERT 在未正确使用时有一个关于 atexit 的条目:
ENV32-C。所有 atexit 处理程序必须正常返回
【讨论】:
atexit 的函数有可能调用exit 或无法正常返回时,通常会出现问题?
exit...