调用的函数指针无效

时间:2015-10-19 14:11:54

标签: c++ emscripten

我使用一个外部库(HarfBuzz),它以“无效的函数指针调用”中止。

这是由以下代码引起的(减少到绝对最小值):

typedef void (*hb_destroy_func_t) (void *);
void _do_nothing(void) { }
void test() {
    hb_destroy_func_t func = (hb_destroy_func_t) _do_nothing;
    void* arg = 0;
    func(arg);
}
EMSCRIPTEN_BINDINGS(foobar) {
    emscripten::function("test", &test);
}

现在我通过将_do_nothing函数更改为:

来解决了这个问题
void doNothing(void *) { }

由于它位于外部库中,我想要更改源。我想知道是否有机会“教导”emscripten来处理这个案件。

2 个答案:

答案 0 :(得分:2)

你绝对不希望Emscripten处理这种情况"。通过指向不兼容函数的函数调用函数是未定义的行为(并且Emscripten可以可靠地报告它,因为它根据类型将函数指针存储在不同的表中)。

您应该提交一个错误,并要求该库的开发人员在他们的代码中解决此问题。

答案 1 :(得分:1)

这完全属于未定义行为的范围:对于转换为不同函数类型的函数指针的结果,唯一可以安全地做的就是将其强制转换回原始类型。此外,无法检查函数指针并找出其原始类型,甚至无法检查其当前类型是否与原始类型匹配。 (包括函数指针和额外类型信息的数据结构可能有帮助)

某些平台可能提供更强有力的保障;依靠它是不可移植的。更多平台可以让它在实践中发挥作用;依赖于此可能会在将来的编译器升级过程中造成破坏,因为它们在存在未定义的行为时更有效地进行优化。