【问题标题】:atexit considered harmful?atexit认为有害吗?
【发布时间】:2013-06-27 18:09:44
【问题描述】:

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

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

【问题讨论】:

    标签: c c99 atexit


    【解决方案1】:

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

    不过,还有其他技术原因:

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

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

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

    【讨论】:

    • “从 glibc 2.2.3 开始,atexit()(和 on_exit(3))可以在共享库中用于建立在卸载共享库时调用的函数。”取自man atexit。但是,我不确定是否在其他 C 库上强制执行相同的行为。因此,如果您只针对 glibc,这不适用于您。
    【解决方案2】:

    安全 CERT 在未正确使用时有一个关于 atexit 的条目:

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

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

    【讨论】:

    • 因此,当传递给atexit 的函数有可能调用exit 或无法正常返回时,通常会出现问题?
    • 这个错误的 C++ 等价物实际上存在于 LLVM 代码库中的某个地方(我忘了在哪里)。他们有一个析构函数调用exit...
    猜你喜欢
    • 2012-04-30
    • 2014-11-24
    • 2010-11-08
    • 1970-01-01
    • 2015-09-09
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    相关资源
    最近更新 更多