调用dlclose(NULL)是否安全?

当我向dlclose传递一个null指针时遇到崩溃。

在调用dlclose之前我应该​​检查null吗?

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

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

这是棘手的。 POSIX指出

如果handle没有引用一个打开的对象,则dlclose()返回一个非零值

从中可以推断出它应该检测一个任意指针,该指针是否指向一个打开的对象。 Linux / Glibc版本显然没有这样的检查,所以你会想自己检查NULL

[另外,Linux的manpage也不是很有帮助。 关于libdl函数的行为是非常隐含的,推迟到POSIX没有非常清楚地声明一致性。

它也没有提到接受NULL不是崩溃。 我们可以从你的测试中假定它不做一个明确的NULL检查,而且它确实需要用指针来执行关闭动作…所以你有它。

遵循malloc / free约定(1),这是一个错误。 如果遵循fopen / fclose惯例(2),那不是。 所以如果有bug的话,那是因为缺乏处理僵尸的惯例。

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

我认为这是为了避免混淆而应该在即将到来的POSIX修订版中修改的内容。


更新

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