Есть ли возможность заставить 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

Есть ли способ заставить это сделать, или мой единственный выбор - писать обертки?


person bobcat    schedule 30.04.2015    source источник


Ответы (1)


Краткий ответ: нет никакого способа, вам придется написать/найти свою собственную оболочку.

Вот объяснение с сайта luajit.org.

Никаких рук!

[...] Библиотека FFI не обеспечивает безопасности памяти, в отличие от обычного кода Lua. Он с радостью позволит вам разыменовать указатель NULL, получить доступ к массивам за пределами границ или неправильно объявить функции C. Если вы сделаете ошибку, ваше приложение может рухнуть, как и эквивалентный код C. Такое поведение неизбежно, поскольку цель состоит в том, чтобы обеспечить полную совместимость с кодом C. Добавление дополнительных мер безопасности, таких как проверка границ, было бы бесполезным. [...] Точно так же нет способа определить допустимый диапазон индексов для возвращаемого указателя. Еще раз: библиотека FFI — это низкоуровневая библиотека.

person ryanpattison    schedule 30.04.2015
comment
Добавление дополнительных мер безопасности, таких как проверка границ, было бы бесполезным. -- что, если я просто определяю структуры C для повышения эффективности и никогда не вызываю C? В любом случае, спасибо за ответ! - person bobcat; 01.05.2015