Ruby rb_gc_mark cra sh из-за нечетного размера буфера swig? - PullRequest
0 голосов
/ 04 марта 2020

Я использую Swig с ruby, чтобы обернуть c библиотеку. Некоторые функции требуют, чтобы им был передан символьный буфер. Функция обеспечит вывод через буфер. В документации сказано, что возвращаемое значение не будет больше 4096, поэтому я кодировал 4096 в следующей карте типов. Внутри кода оболочки я вижу, что буфер выделен на 1 больше, чем я предоставил, поэтому в этом случае буфер будет 4097.

%cstring_bounded_output(char *name, 4096);
long foo(char *name);

Внутри кода оболочки я вижу это.

char temp4[4096+1] ;

Когда я генерирую обертку и запускаю некоторый код, я вижу случайные сбои (5 или 6 из 100 запусков, при которых каждый прогон вызывает эту функцию около 4000 раз). Вот типы сбоев, которые я вижу.

[BUG] rb_gc_mark(): 0x0000000000979900 is T_NONE

и

[BUG] rb_gc_mark(): unknown data type 0x10(0x000000000180de00) non object

Когда я изменяю размер буфера на 4096 , Я не наблюдал никаких сбоев (пока).

Мне интересно, насколько вероятно, что этот «нечетный» размер буфера может испортить сборщик мусора ruby, или есть ли у кого-нибудь какие-либо предложения о том, как что-то отлаживать нравится. Я чувствую, что это связано с вызовами этой функции, так как все трассировки трассировки, похоже, связаны с возвращаемым значением или вызовом функции.

Это выполняется с ruby 2.5.1

...