Подробности
[В начало]
Проблема в реализации № S0837
Краткое описание
Segfault при попытке реализовать динамический интерфейс
Подробное описание
При попытке реализовать интерфейс, тип которого был зарегистрирован динамически (используя g_type_register_dynamic), получается Segfault.
Пример, воспроизводящий проблему, для простоты использует GTypeModule для динамической регистрации интерфейса. Но тоже самое происходит, если создать свой класс, реализующий GTypePlugin, и использовать объект этого класса в g_type_register_dynamic.
Проблема возникла в версии glib-2.23, предыдущие версии библиотеки корректно работают с динамически объявленным интерфейсом.
Раздел стандарта
Linux Standard Base Desktop Specification 4.0, Section 16.5. Interfaces for libgobject-2.0, который ссылается на Gobject 2.8.6 Reference Manual, Section "Type Information"
Пример
#include <glib-object.h> #include <stdio.h> // TestModule - derived from GTypeModule GType test_module_type_register() { GTypeInfo test_module_info = { .class_size = sizeof(GTypeModuleClass), .instance_size = sizeof(GTypeModule) }; return g_type_register_static(G_TYPE_TYPE_MODULE, "test_module", &test_module_info, 0); } // TestIface - dynamically registered interface GType test_iface_type_register(GTypeModule* module) { GTypeInfo test_iface_info = { .class_size = sizeof(GTypeInterface) }; return g_type_module_register_type(module, G_TYPE_INTERFACE, "test_iface", &test_iface_info, 0); } // TestObject - statically registered object, implements interface GType test_object_type_register() { GTypeInfo test_object_info = { .class_size = sizeof(GObjectClass), .instance_size = sizeof(GObject), }; return g_type_register_static(G_TYPE_OBJECT, "test_object", &test_object_info, 0); } void test_object_implement_iface(GType test_object_type, GType test_iface_type) { GInterfaceInfo test_object_iface_info = {}; g_type_add_interface_static(test_object_type, test_iface_type, &test_object_iface_info); } int main() { g_type_init(); GType test_module_type = test_module_type_register(); GTypeModule* module = G_TYPE_MODULE(g_object_new(test_module_type, NULL)); GType test_iface_type = test_iface_type_register(module); GType test_object_type = test_object_type_register(); test_object_implement_iface(test_object_type, test_iface_type); g_object_unref(module); return 0; }
Компонент
gtk-gobject-2.23
Принято
Gnome Bugzilla 608315
Статус
Исправлено в gtk-gobject-2.23.4
[В начало]