调用dlclose(NULL)是否安全?

时间:2012-07-10 12:05:28

标签: linux posix dynamic-loading dynamic-library shared-libraries

当我将null指针传递给dlclose时,我遇到了崩溃。

我应该在致电dlclose之前检查空吗?

POSIX对此没有任何说明: http://pubs.opengroup.org/onlinepubs/7908799/xsh/dlclose.html

它是未定义的行为还是dlclose实施中的错误?

3 个答案:

答案 0 :(得分:3)

这很棘手。 POSIX声明

  

如果handle未引用打开的对象,dlclose()将返回非零值

您可以从中推断出,对于任意指针,它应该检测该指针是否指向打开的对象。 Linux / Glibc版本显然没有这样的检查,因此您需要自己检查NULL

[除此之外,Linux手册页也不是很有帮助。它隐含于libdl函数的行为,在没有明确声明一致性的情况下推迟到POSIX。]

答案 1 :(得分:1)

它也没有说明接受NULL而不是崩溃。我们可以从您的测试中假设它没有进行明确的NULL检查,并且它确实需要以某种方式使用指针来执行结束操作......所以你有它。

答案 2 :(得分:0)

遵循malloc / free约定(1),这是一个错误。如果它遵循fopen / fclose约定(2)则不符合。因此,如果存在错误,则它符合标准,因为它缺乏处理僵尸的惯例。

  • 约定(1)适用于C ++ 11移动语义
  • 公约(2)对呼叫者承担更多责任。特别是,如果已完成移动操作,则dtor必须显式检查null。

我认为这应该针对即将到来的POSIX修订进行修订,以避免混淆。

更新

我从这个回答https://stackoverflow.com/a/6277781/877329找到了,然后阅读man pthread_join,你可以使用无效的tid调用pthread_join,支持malloc/free传播。我在动态加载器接口中发现的另一个问题是它不使用标准错误处理系统,但有自己的dlerror函数。