调用了无效的函数指针
Invalid function pointer called
我使用一个外部库 (HarfBuzz),它以 "Invalid function pointer called".
中止
这是由以下代码(减少到绝对最小值)引起的:
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 *) { }
由于它在外部库中,我不想更改源。请问有没有机会"teach"emscripten
处理这个案子
您绝对不希望 Emscripten "handle this case"。通过不兼容类型的函数指针调用函数是未定义的行为(Emscripten 可以可靠地报告它,因为它根据类型将函数指针存储在单独的表中)。
您应该提交一个错误并要求库的开发人员在他们的代码中修复此问题。
这完全属于未定义行为的范畴:对于转换为不同函数类型的函数指针的结果,您唯一可以安全地做的就是将其转换回原始类型。此外,无法检查函数指针并找出其原始类型,甚至无法确定其当前类型是否与原始类型匹配。 (包含函数指针和额外类型信息的数据结构可能会有所帮助)
部分平台可能会提供更强的保障;依靠它是不可移植的。更多的平台可能会让它在实践中发挥作用;依赖它可能会在未来的编译器升级过程中造成破坏,因为它们在存在未定义行为的情况下更有效地进行优化。
我使用一个外部库 (HarfBuzz),它以 "Invalid function pointer called".
中止这是由以下代码(减少到绝对最小值)引起的:
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 *) { }
由于它在外部库中,我不想更改源。请问有没有机会"teach"emscripten
处理这个案子
您绝对不希望 Emscripten "handle this case"。通过不兼容类型的函数指针调用函数是未定义的行为(Emscripten 可以可靠地报告它,因为它根据类型将函数指针存储在单独的表中)。
您应该提交一个错误并要求库的开发人员在他们的代码中修复此问题。
这完全属于未定义行为的范畴:对于转换为不同函数类型的函数指针的结果,您唯一可以安全地做的就是将其转换回原始类型。此外,无法检查函数指针并找出其原始类型,甚至无法确定其当前类型是否与原始类型匹配。 (包含函数指针和额外类型信息的数据结构可能会有所帮助)
部分平台可能会提供更强的保障;依靠它是不可移植的。更多的平台可能会让它在实践中发挥作用;依赖它可能会在未来的编译器升级过程中造成破坏,因为它们在存在未定义行为的情况下更有效地进行优化。