将 null 传递给 dlclose()
Passing null to dlclose()
将 null (0
, NULL
, nullptr
, ..) 传递给 dlclose()
是否安全?
我在 manual.
中找不到与此相关的任何内容
不安全。
查看 glibc 实现,传递给此函数的句柄是指向 struct link_map
实例的指针。然后在没有 NULL 检查的情况下取消引用该指针。
所以你需要在调用dlclose
.
之前检查是否为NULL
如果没有记录,则很可能没有(或“最好”未定义)。
实际上,一个简单的测试就可以验证您的平台:
编译这个
#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
或提供之前进行空检查应该是微不足道的
一个包装器,如果不方便的话。
将 null (0
, NULL
, nullptr
, ..) 传递给 dlclose()
是否安全?
我在 manual.
中找不到与此相关的任何内容不安全。
查看 glibc 实现,传递给此函数的句柄是指向 struct link_map
实例的指针。然后在没有 NULL 检查的情况下取消引用该指针。
所以你需要在调用dlclose
.
如果没有记录,则很可能没有(或“最好”未定义)。 实际上,一个简单的测试就可以验证您的平台:
编译这个
#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
或提供之前进行空检查应该是微不足道的
一个包装器,如果不方便的话。