LuaJIT 是否有选项可以进行边界检查?

LuaJIT 知道它定义的 C 类型和数组的长度,但它不会检查边界:

ffi = require("ffi")

ten_ints = ffi.typeof("int [10]")
p1 = ten_ints()
print(ffi.sizeof(p1))  -- 40

var_ints = ffi.typeof("int [?]")
p2 = ffi.new(var_ints, 10)
print(ffi.sizeof(p2)) -- 40

p1[1000000] = 1 -- segfault
p2[1000000] = 1 -- segfault

有没有办法可以让它检查边界,或者我的唯一选择是编写包装器?

点赞
用户2726734
用户2726734

简短回答:没有办法,你必须编写/找到自己的包装器。

下面是来自 luajit.org 的解释:

并不会手把手指导!

[...] FFI 库不提供内存安全,不同于普通的 Lua 代码。它会允许您对 NULL 指针进行解引用,访问越界数组或者错误声明 C 函数,如果您犯了一个错误,您的应用程序可能会崩溃,就像等价的 C 代码一样。这种行为是不可避免的,因为目标是在 C 代码中提供完全的互操作性。添加额外的安全措施,如边界检查,是徒劳的。[...] 同样,无法推断返回指针的有效索引范围。再次强调:FFI 库是一个低级库。

2015-04-30 21:51:22