当我向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的话,那是因为缺乏处理僵尸的惯例。
我认为这是为了避免混淆而应该在即将到来的POSIX修订版中修改的内容。
我从这个答案找到https://stackoverflow.com/a/6277781/877329 ,然后阅读man pthread_join
,你可以调用pthread_join
与一个无效的tid,支持malloc/free
对流。 我发现动态加载器接口的另一个问题是,它不使用标准的错误处理系统,但有它自己的dlerror
函数。