Open fedya opened 1 year ago
__attribute__((cleanup(func)))
это расширение, что в EDG приделали, или сами МЦСТ добавили, не знаю.
Суть в том, что поддержка его неполноценная, для С это работает. Для C++ этот cleanup как-то мешается с деструкторами и в C++ его поддерживать не стали. В итоге компилятор выводит ворнинг, что не знает такого атрибута. А в программе будут утечки памяти, ведь ресурсы не освобождаются.
Из-за того как сделан g_autofree - исправить это невозможно. Я сделал макросы для помощи в исправлении, надо через sed фильтры исходники пропускать. А вместо ворнинга на cleanup будет уже ошибка, так что можно будет найти и исправить утечки памяти.
В Альте сейчас 8 пакетов с такими патчами:
mate-system-monitor packagekit eiskaltdcpp appstream libcamera cherrytree gnome-commander libdnf
Примеры sed патчей:
sed -i "s|g_autofree char \*|g_autofree_edg(char) |" src/sysinfo.cpp
sed -i "/g_autofree gchar/{s|g_autofree gchar|g_autofree_edg(gchar)|;s|\*||g}" src/load-graph.cpp
sed -i "s|g_autofree gchar \*|g_autofree_edg_ex(gchar,std::string) |" eiskaltdcpp-gtk/src/{adlsearch,hub,mainwindow,uploadqueue}.cc
sed -i "s|g_autofree gchar\*|g_autofree_edg_ex(gchar,Glib::ustring) |" src/ct/ct_{misc_utils,storage_xml}.cc
sed -i "s|g_autofree gchar\*|g_autofree_edg_ex(gchar,std::string) |" src/ct/ct_*.cc
sed -i "s|pConverted+|(gchar*)&|" src/ct/ct_misc_utils.cc
sed -i "s|save_to_buffer(|&(gchar*\&)|" src/ct/ct_{imports,image,parser_html}.cc
sed -i "s|filename(pOutStr|filename((gchar*)pOutStr|" src/ct/ct_filesystem.cc
Вот спека libdnf-0.60.0
, где можно патч посмотреть:
https://packages.altlinux.org/ru/sisyphus_e2k/srpms/libdnf/specfiles/
Пришлось потрудиться это пропатчить, там еще и свой макрос придумали с cleanup под названием hy_autoquery
.
Попробовал применить все равно лезет
lcc: "/home/omv/libdnf/BUILD/libdnf-0.70.0/libdnf/hy-iutil.cpp", строка 446: ошибка #254:
имя типа недопустимо
g_autoptr(GFile) src = g_file_new_for_path(srcPath.c_str());
В коде патча к glib2.0 вижу такое
+#define g_autoptr_free(TypeName, var) _GLIB_AUTOPTR_FUNC_NAME(TypeName)(&var)
+#define g_autoptr(TypeName) EDG_CLEANUP_HELPER<TypeName, TypeName*, _GLIB_AUTOPTR_FUNC_NAME(TypeName)>
Но от чего-то все равно не работает
У вас версия 0.70, а я исправлял 0.60. Так что дорабатывайте исправления.
Глянул патч для glib2.0, я так понял он добавляет возможность использовать всякие g_autoptr в lcc Однако вот пытаюсь собрать libdnf-0.70.0 и там лезет
в участках кода типа
Можно подсказать куда копнуть тут? Проблема в glib2.0 или непосредственно в libdnf?
Пример упавшей сборки https://file-store.rosalinux.ru/api/v1/file_stores/295646e84de0ec62a601993c58219e1509cd7b69