2015-10-19 89 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

這在未定義行爲的領域是穩固的:您可以安全地將函數指針的結果轉換爲不同函數類型的唯一方法是將其轉換回原始類型。此外,沒有辦法檢查一個函數指針並找出它的原始類型,甚至不知道它的當前類型是否與原始類型相匹配。 (包括函數指針加上額外類型信息的數據結構可能有所幫助)

某些平臺可能提供更強的保證;依靠那是不可移植的。更多的平臺可能允許它在實踐中工作;依賴於此可能會在將來的編譯器升級過程中導致破壞,因爲它們在存在未定義行爲的情況下優化時更有效。