2015-10-19 47 views
2

我使用一个外部库(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来处理这种情况。

+1

代码的哪些部分是库的一部分? – anorm

+3

如果这是图书馆所做的事情,那么这是图书馆中的一个错误。报告。 –

+0

@anorm我从文中的猜测:'void _do_nothing(void){}' – guntbert

回答

2

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

您应该提交一个错误并要求库的开发人员在代码中修复此错误。

1

这在未定义行为的领域是稳固的:您可以安全地将函数指针的结果转换为不同函数类型的唯一方法是将其转换回原始类型。此外,没有办法检查一个函数指针并找出它的原始类型,甚至不知道它的当前类型是否与原始类型相匹配。 (包括函数指针加上额外类型信息的数据结构可能有所帮助)

某些平台可能提供更强的保证;依靠那是不可移植的。更多的平台可能允许它在实践中工作;依赖于此可能会在将来的编译器升级过程中导致破坏,因为它们在存在未定义行为的情况下优化时更有效。