Подробности

[В начало]

Проблема в реализации № 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

[В начало]