问题描述
将 null (0
,NULL
,nullptr
,..) 传递给 dlclose()
是否安全?
我在 manual 中找不到与此相关的任何信息。
解决方法
如果没有记录,很可能没有(或“最好”未定义)。 实际上,一个简单的测试可以验证您的平台:
编译这个
#include <dlfcn.h>
int main()
{
dlclose(0);
}
已经产生以下编译器警告 (gcc):
test.c: In function ‘main’:
test.c:5:2: warning: null argument where non-null required (argument 1) [-Wnonnull]
5 | dlclose(0);
| ^~~~~~~
/usr/bin/ld: /tmp/ccYF9oqz.o: in function `main':
运行它,由于分段错误而按预期崩溃。
你为什么想要或需要首先知道这一点是个问题。
在调用 dlclose
或提供之前进行空检查应该是微不足道的
一个包装器,如果不方便的话。
它不安全。
查看glibc的实现,传递给这个函数的句柄是一个指向struct link_map
实例的指针。然后在没有空检查的情况下取消引用该指针。
因此您需要在调用 dlclose
之前检查 NULL。