Как исправить ошибку cra sh, вызванную из библиотеки Cairo? - PullRequest
1 голос
/ 29 мая 2020

У меня есть устаревшее приложение, которое использует библиотеку Cairo для рисования изображений и текстов. Иногда это приложение вылетает. Я не знаю пути воспроизведения, довольно редко и случайным образом. Я создал дампы cra sh и обнаружил, что каждый раз, когда я получаю нарушение прав доступа от cairo_win32_surface_get_dc function .

Вот исходный код из Каира -

HDC  cairo_win32_surface_get_dc (cairo_surface_t *surface)
{
    if (surface->backend->type == CAIRO_SURFACE_TYPE_WIN32)
    return to_win32_surface(surface)->dc;

    if (_cairo_surface_is_paginated (surface)) {
    cairo_surface_t *target = _cairo_paginated_surface_get_target (surface);
    if (target->backend->type == CAIRO_SURFACE_TYPE_WIN32_PRINTING)
        return to_win32_surface(target)->dc;
    }

    return NULL;
}

Эта функция возвращает HD C, связанный с этой поверхностью, или NULL, если нет. Он также возвращает NULL, если поверхность не является поверхностью win32.

Судя по дампу cra sh, который я обнаружил, surface->backend было NULL, когда произошла эта sh ошибка. Что ожидается, если вы посмотрите на код выше, он не проверяет, является ли surface или surface->backend NULL или нет.

Код моего приложения выглядит следующим образом -

if( mySurface ) {
    hDC = cairo_win32_surface_get_dc(mySurface);
}

Моя идея заключалась в том, чтобы добавить дополнительную проверку, является ли mySurface->backend NULL или нет, перед вызовом cairo_win32_surface_get_dc, но mySurface->backend недоступен отсюда. Выдает мне следующую ошибку -

Error           C2027   use of undefined type '_cairo_surface'
Error (active)  E0393   pointer to incomplete class type is not allowed 

Также обратите внимание, что этот блок не всегда трескается sh, поэтому я не могу понять, что здесь происходит не так.

После поиска в Google немного, я обнаружил, что некоторые люди проверяют наличие каких-либо предыдущих ошибок вроде этой:

if (cairo_surface_status(mySurface) == 0) {
    hDC = cairo_win32_surface_get_dc(mySurface);
}

Исправит ли это изменение мою проблему? Любая помощь приветствуется. Спасибо.

...