在Luajit中如何使用strtok?

我的代码如下:

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 无法运行。我应该怎么处理?

点赞
用户646619
用户646619
本地变量 `psrc` 被定义为一个长度为 `src` 的指针类型,`ffi.copy` 把 `src` 指针中的东西存到 `psrc` 里。

当使用 `ffi.copy` 处理字符串源时,它还复制了一个空终止符,但是你的数组太小了,存不下,导致溢出。

此外,不要使用 `strtok`,考虑使用 Lua 模式。它们更安全、易于使用,而且不依赖于 FFI。
2014-06-04 17:57:42