LuaJIT FFI передает символ ** в функцию C

Пробовал LuaJIT FFI и столкнулся с любопытной проблемой. У меня есть следующий код:

local ffi = require("ffi")
ffi.cdef [[
    int decode(char* encodedToken, char** payload);
]]

local lib = ffi.load("lib.so")

local function decode(encoded_token)
    local c_encoded_token = ffi.new("char[?]", #encoded_token, encoded_token)
    local c_token = ffi.new("char*[1]")
    lib.decode(c_encoded_token, c_token)

    local resonse = ffi.string(c_token[0])
    return response
end

По сути, общий объект имеет метод для декодирования входящего токена и записи вывода в char** payload. Странно то, что этот код работает, когда я запускаю одну итерацию функции decode, но при запуске в цикле вызывает Segmentation fault.

Это наводит меня на мысль, что в моем распределении ffi.new("char*[1]") есть утечка памяти. Я даже пытался обернуть его вызовом ffi.gc, что тоже не помогло:

local c_token = ffi.gc(ffi.new("char*[1]"), ffi.free)
-- do stuff
c_token = nil

Это первый раз, когда я пробую FFI, поэтому любые указатели приветствуются!


person Checksum    schedule 02.05.2019    source источник


Ответы (1)


Сам разобрался. По-видимому, это произошло из-за того, что строка C с нулевым завершением занимала еще один символ.

Это сработало:

local c_encoded_token = ffi.new("char[?]", #encoded_token + 1, encoded_token)
person Checksum    schedule 03.05.2019