Подробности
[В начало]
Проблема в реализации № 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
[В начало]