الحد الزمني للتنفيذ لنص LUA يسمى من C API
سؤال
luaL_loadfile(mState, path.c_str());
lua_pcall(mState, 0, 0, 0);
هل هناك طريقة لوضع حد للتنفيذ (على سبيل المثال من 10 إلى 20 ثانية) لهذين C ++ ، هذا التحميل ثم تنفيذ ملف LUA؟
نظرًا لأن ملف LUA غير موثوق به ، فأنا لا أريد أن يقوم مستخدم ضار بتعليق البرنامج إلى أجل غير مسمى مع حلقة لا حصر لها في رمز LUA.
وضع علامة C لأن واجهة برمجة تطبيقات LUA هي C ، وضع علامة C ++ لأنني أستخدم C ++
المحلول
هناك lua_sethook والتي يمكن استخدامها لإخبار المترجم بالاتصال بخطاف بعد تنفيذ كل تعليمات "العد". وبهذه الطريقة ، يمكنك مراقبة البرنامج النصي للمستخدم وإنهائه إذا كان يأكل حصته:
int lua_sethook (lua_State *L, lua_Hook f, int mask, int count);
يمكن أيضًا استخدام هذا من لوا:
debug.sethook(function() print("That's enough for today"); os.exit(0); end, "", 10000)
for i=1,10000 do end
إذا كنت تستخدم التقنيات من http://lua-users.org/wiki/Sandboxes ثم يمكنك إعداد بيئة تنفيذ آمنة مع sethook()
والأصدقاء بالكامل من LUA ثم قم بالتبديل إلى وضع Sandbox أثناء تنفيذ البرنامج النصي للمستخدم. لقد جربت ذلك هنا ، فقط لكي تبدأ:
-- set an execution quota
local function set_quota(secs)
local st=os.clock()
function check()
if os.clock()-st > secs then
debug.sethook() -- disable hooks
error("quota exceeded")
end
end
debug.sethook(check,"",100000);
end
-- these are the global objects, the user can use:
local env = {print=print}
-- The user code is allowed to run for 5 seconds.
set_quota(5)
-- run code under environment:
local function run(untrusted_code)
local untrusted_function, message = loadstring(untrusted_code)
if not untrusted_function then return nil, message end
setfenv(untrusted_function, env)
return pcall(untrusted_function)
end
-- here is the user code:
local userscript=[[
function fib(n)
if n<2 then return n
else return fib(n-2)+fib(n-1)
end
end
for n=1,42 do print(n,fib(n)) end
]]
-- call it:
local r,m=run(userscript)
print(r,m)
يجب أن يطبع هذا قيم FIB () لمدة 5 ثوان ثم إظهار خطأ.