2015-10-19 3 views
2

Я использую внешнюю библиотеку (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 *) { } 

В связи с тем что это во внешней библиотеке я делаю не хочу изменить источник. Интересно, есть ли возможность «научить» emscripten для обработки этого случая.

+1

Какие части кода являются частью библиотеки? – anorm

+3

Если это то, что делает библиотека, это ошибка в библиотеке. Доложите об этом. –

+0

@anorm Мое предположение из текста: 'void _do_nothing (void) {}' – guntbert

ответ

2

Вы определенно не хотите, чтобы Emscripten «обрабатывал этот случай». Вызов функции с помощью указателя на функцию-несовместимый тип - это неопределенное поведение (и Emscripten может достоверно сообщать об этом, поскольку хранит указатели на функции в отдельных таблицах на основе их типа).

Вы должны просто зарегистрировать ошибку и попросить разработчиков библиотеки исправить это в их код.

1

Это твердо в сфере неопределенного поведения: единственное, что вы можете смело сделать с результатом нажатия указателя функции на другой тип функции, - это вернуть его обратно к исходному типу. Кроме того, нет возможности проверить указатель на функцию и узнать ее оригинальный тип, или даже если текущий тип соответствует исходному типу. (Может помочь структура данных, включая указатель на функцию плюс дополнительная информация о типе)

Некоторые платформы могут обеспечить более надежную гарантию; опираясь на то, что он не переносится. Другие платформы могут позволить ему работать на практике; полагаясь на это, вероятно, вызовет поломку во время будущих обновлений компилятора, поскольку они становятся более эффективными при оптимизации неопределенного поведения.

Смежные вопросы