我可以调用带有错误签名的dlsym()导入的函数,为什么?

Mar*_*rio 1 c++ casting shared-libraries void-pointers dlsym

host.cpp有:

int main (void)
{
    void * th = dlopen("./p1.so", RTLD_LAZY);
    void * fu = dlsym(th, "fu");

    ((void(*)(int, const char*)) fu)(2, "rofl");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

并且p1.cpp具有:

#include <iostream>

extern "C" bool fu (float * lol)
{
    std::cout << "fuuuuuuuu!!!\n";
    return true;
}
Run Code Online (Sandbox Code Playgroud)

(我故意留下错误检查出来)

当执行主机时,"fuuuuuuuu !!!"被正确打印,即使我将带有完全不同功能签名的符号的void指针类型化.

为什么会发生这种情况,这种行为在不同的编译器之间是否一致

Pup*_*ppy 6

发生这种情况是因为UB,这种行为与任何事情都不一致,无论如何.


Mic*_*ker 5

因为void指针中没有关于函数签名的信息.或者除了地址之外的任何信息.如果你开始使用参数,你可能会遇到麻烦.