Подробности

[В начало]

Проблема в стандарте № S0663

Краткое описание

В документации по функции gdk_pixbuf_loader_close очень нечетко описано соотношение между возвращаемым значением и выставляемой ошибкой

Подробное описание

Полное описание функции gdk_pixbuf_loader_close:
Informs a pixbuf loader that no further writes with gdk_pixbuf_loader_write() will occur, so that it can free its internal loading structures. Also, tries to parse any data that hasn't yet been parsed; if the remaining data is partial or corrupt, an error will be returned. If FALSE is returned, error will be set to an error from the GDK_PIXBUF_ERROR or G_FILE_ERROR domains. If you're just cancelling a load rather than expecting it to be finished, passing NULL for error to ignore it is reasonable.

loader : A pixbuf loader.
error : return location for a GError, or NULL to ignore errors
Returns : TRUE if all image data written so far was successfully passed out via the update_area signal

В подавляющем большинстве функций glib (и использующих glib), которые возвращают значение и выставляют ошибку в формате GError, возвращаемое функцией значение однозначно определяет факт выставления ошибки. Например, для функций возвращающих gboolean, ошибка выставляется тогда и только тогда, когда возвращается FALSE. gdk_pixbuf_loader_write - одна из таких функций.

Но в gdk_pixbuf_loader_close возможна ситуация(когда все записанные в загрузчик данные коректны, но не достаточны), когда функция возвращается TRUE, но выставляет ошибку.

В документации употребляются словосочетания
"error will be returned"
"FALSE is returned"
"error will be set"
которые делают даже сам факт независимости возвращаемого значения и выставления ошибки трудно уловимым.

Раздел стандарта

Gdk-pixbuf 2.6.2 API Reference, GdkPixbufLoader

Возможные последствия

Даже сама библиотека GdkPixbuf нередко использует в качестве критерия полноты данных, переданных загрузчику, возвращаемое gdk_pixbuf_loader_close() значение, а не факт невыставления ошибки. Что влечет за собой противоречия в реализации.

Например, gdk_pixbuf_new_from_file() может вернуть изображение, которое было создано из неполных данных. При этом ошибка будет выставлена функцией gdk_pixbuf_loader_close().

[В начало]