1

私のコードは次のとおりです。

local ffi = require "ffi"
local ffi_C = ffi.C
local ffi_typeof = ffi.typeof
local ffi_new = ffi.new
local ffi_string = ffi.string
local NULL = ngx.null
local tostring = tostring

ffi.cdef[[
    char * strtok(char * str, const char * delimiters);
]]

local p_char_type = ffi_typeof("char[?]")

function split(src, c)
    local result = {}

    local pch = ffi_new(p_char_type, 1)
    local psrc = ffi_new(p_char_type, #src)
    local pc = ffi_new(p_char_type, #c)

    ffi.copy(psrc, src)
    ffi.copy(pc, c)
    pch = ffi_C.strtok(psrc, pc)

    while pch do
        table.insert(result, ffi_string(pch))
        pch = ffi_C.strtok(NULL, pc)
        ngx.log(ngx.ERR, "pch ok")
    end

    ngx.log(ngx.ERR, "split ok")

    return result
end

nginx を実行すると、何か問題が発生しました。while ループから戻った後、nginx ワーカー プロセスがシグナル 11 でクラッシュしました。最後の ngx.log は実行できません。どうすれば対処できますか?

4

1 に答える 1

1
local psrc = ffi_new(p_char_type, #src)
ffi.copy(psrc, src)

ffi.copy文字列ソースを指定すると、null ターミネータもコピーされますが、配列が小さすぎてそれを保持できないため、オーバーフローが発生します。

また、 を使用する代わりに、strtokLua パターンの使用を検討してください。それらはより安全で使いやすく、FFI に依存しません。

于 2014-06-04T17:57:42.373 に答える