Vala: предупреждение и ошибка сегментации с методом to_utf32_fast - PullRequest
0 голосов
/ 27 мая 2018

Я получил предупреждение и ошибку сегментации при компиляции и выполнении примерно следующего кода, который использует метод to_utf32_fast для string и должен вернуть количество символов UTF-32, закодированных в переменной codepoint_count.Этот метод переносится в функцию C g_utf8_to_ucs4_fast и почему-то out codepoint_count заканчивается как long * * аргумент вместо ожидаемого long *.

У меня есть обходной путь, так что это не срочно.

int main (string[] args) {
    string test = "abc";
    long codepoint_count;
    string utf32_version = test.to_utf32_fast(-1, out codepoint_count).to_string();
    stdout.printf("success");
    return 0;
}

Соответствующая часть вывода:

C:/msys64/usr/src/outerror.vala.c: In function '_vala_main':
C:/msys64/usr/src/outerror.vala.c:78:50: warning: passing argument 3 of 'g_utf8_to_ucs4_fast' from incompatible pointer type [-Wincompatible-pointer-types]
  _tmp2_ = g_utf8_to_ucs4_fast (test, (glong) -1, &_tmp1_);
                                                  ^
In file included from C:/msys64/mingw64/include/glib-2.0/glib/gstring.h:33:0,
                 from C:/msys64/mingw64/include/glib-2.0/glib/giochannel.h:34,
                 from C:/msys64/mingw64/include/glib-2.0/glib.h:54,
                 from C:/msys64/usr/src/outerror.vala.c:5:
C:/msys64/mingw64/include/glib-2.0/glib/gunicode.h:798:12: note: expected 'glong * {aka long int *}' but argument is of type 'glong ** {aka long int **}'
 gunichar * g_utf8_to_ucs4_fast (const gchar      *str,
            ^~~~~~~~~~~~~~~~~~~

Я посмотрел на переданный исходный код C, а третий аргумент g_utf8_to_ucs4_fast - это адрес неинициализированного указателя на long, которыйпозже освобождается с g_free.Это запускает segfault при запуске программы.

Я что-то не так делаю в способе вызова этой функции?Он объявлен как public string32 to_utf32_fast (long len = -1, out long? items_written = null).

Я новичок в Vala (более знаком с C) и не уверен, что понимаю аннотации аргументов.Второй аргумент не должен передаваться в C как long **, а не long *, но, возможно, маркер обнуляемости ? или значение по умолчанию = null заставляет Vala думать, что переменная items_written является указателем на long (или его эквивалент в Вале), а не long.Если это так, то, возможно, имеется ошибка в объявлении метода или неоднозначность в синтаксисе Vala.

1 Ответ

0 голосов
/ 27 мая 2018

Объявление неверно.Этот код работает просто отлично:

[CCode (cname = "g_utf8_to_ucs4_fast")]
public extern string32 to_utf32_fast_ (string s, long len = -1,
    out long items_written);

int main (string[] args) {
    string test = "abc";
    long codepoint_count;
    string32 utf32_version = to_utf32_fast_(test, -1, out codepoint_count);
    stdout.printf("success");
    return 0;
}

В исходном объявлении из glib-2.0.vapi параметр items_written будет glong** в C, но на самом деле это glong*.

Я сообщил об этом как об ошибке:

https://gitlab.gnome.org/GNOME/vala/issues/634

...