Я получил предупреждение и ошибку сегментации при компиляции и выполнении примерно следующего кода, который использует метод 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.