6

当我将null指针传递给dlclose.

我应该在调用之前检查 nulldlclose吗?

POSIX 对此一无所知:http: //pubs.opengroup.org/onlinepubs/7908799/xsh/dlclose.html

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

4

3 回答 3

5

这很棘手。POSIX 指出

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

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

[此外,Linux 联机帮助页也不是很有帮助。它对函数的行为非常隐含libdl,在没有明确声明符合性的情况下遵循 POSIX。]

于 2012-07-10T12:19:12.947 回答
1

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

于 2012-07-10T12:20:32.597 回答
1

遵循malloc/free约定(1),这是一个错误。如果它遵循fopen/fclose约定(2),则不是。所以如果有一个错误,它在标准中,因为它缺乏处理僵尸的约定。

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

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


更新

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

于 2015-07-03T09:38:47.767 回答