LU Lua  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Безопасная песочница

Тест по теме «Безопасная песочница» проверяет чтение кода, поиск скрытых допущений и выбор решения для обычных и граничных сценариев. В нём 30 вопросов, из них 18 содержат фрагменты Lua. Условия отдельно отмечают случаи, зависящие от версии языка или внешней библиотеки.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: В каждом вопросе выберите один ответ из пяти. На работу отведено 85 минут. После завершения можно посмотреть правильные ответы, объяснения и результат по каждой теме.
Вопрос 1 из 30
Что нужно знать о Lua, прежде чем предсказывать результат этого кода? Ответ должен описывать основной механизм раздела «Ограничение окружения».
LuaLua · Ограничение окружения · разбор 1
local env={assert=assert,error=error,ipairs=ipairs,pairs=pairs,
  tonumber=tonumber,tostring=tostring,type=type,
  math=readonly(math),string=readonly(string),table=safe_table}
local chunk=assert(load(source,"guest","t",env))
Вопрос 2 из 30
Какой отказ должен быть воспроизводимым в тесте? Нужен отрицательный сценарий для раздела «Ограничение окружения».
LuaLua · Ограничение окружения · разбор 2
local function reproduce_case()
  local env={assert=assert,error=error,ipairs=ipairs,pairs=pairs,
    tonumber=tonumber,tostring=tostring,type=type,
    math=readonly(math),string=readonly(string),table=safe_table}
  local chunk=assert(load(source,"guest","t",env))
end
reproduce_case()
Вопрос 3 из 30
Какая гарантия важнее сохранения точной формы кода? Нужен основной контракт раздела «Ограничение окружения».
LuaLua · Ограничение окружения · разбор 3
do
  local env={assert=assert,error=error,ipairs=ipairs,pairs=pairs,
    tonumber=tonumber,tostring=tostring,type=type,
    math=readonly(math),string=readonly(string),table=safe_table}
  local chunk=assert(load(source,"guest","t",env))
end
Вопрос 4 из 30
Код по разделу «Ограничение окружения» уходит в эксплуатацию. Какое ограничение нельзя прятать внутри реализации? Нужна эксплуатационная граница раздела «Ограничение окружения».
Вопрос 5 из 30
Какое правило лучше всего описывает границы раздела «Ограничение окружения»? Ответ должен охватывать весь раздел «Ограничение окружения».
Вопрос 6 из 30
Что нельзя заменить привычкой из другого языка при чтении этого кода? Ответ должен описывать основной механизм раздела «Запрет опасных API».
LuaLua · Запрет опасных API · разбор 1
local env={print=safe_print,math=readonly(math)}
assert(env.io==nil and env.os==nil and env.package==nil and env.debug==nil)
return assert(load(source,"guest","t",env))
Вопрос 7 из 30
Какую границу стоит сделать явной в регрессионной проверке? Выберите именно проверяемую границу раздела «Запрет опасных API».
LuaLua · Запрет опасных API · разбор 2
local function reproduce_case()
  local env={print=safe_print,math=readonly(math)}
  assert(env.io==nil and env.os==nil and env.package==nil and env.debug==nil)
  return assert(load(source,"guest","t",env))
end
reproduce_case()
Вопрос 8 из 30
Что должно пережить замену вспомогательных функций и имён переменных? Речь идёт о центральном правиле раздела «Запрет опасных API».
LuaLua · Запрет опасных API · разбор 3
do
  local env={print=safe_print,math=readonly(math)}
  assert(env.io==nil and env.os==nil and env.package==nil and env.debug==nil)
  return assert(load(source,"guest","t",env))
end
Вопрос 9 из 30
В ревью обсуждают «Запрет опасных API». Какое утверждение действительно влияет на надёжность решения? Выберите практическое следствие раздела «Запрет опасных API».
Вопрос 10 из 30
Какое утверждение о разделе «Запрет опасных API» наиболее полное и точное? Ответ должен охватывать весь раздел «Запрет опасных API».
Вопрос 11 из 30
В чём ключ к разбору строки «if budget<=0 then error("instruction budget exceeded") end»? Выберите основное правило раздела «Лимиты ресурсов».
LuaLua · Лимиты ресурсов · разбор 1
local budget=100000
local function hook()
  budget=budget-1000
  if budget<=0 then error("instruction budget exceeded") end
end
debug.sethook(hook,"",1000)
local ok,err=pcall(chunk)
debug.sethook()
Вопрос 12 из 30
Какой риск останется незамеченным, если выполнить код только один раз? Нужен отрицательный сценарий для раздела «Лимиты ресурсов».
LuaLua · Лимиты ресурсов · разбор 2
local function reproduce_case()
  local budget=100000
  local function hook()
    budget=budget-1000
    if budget<=0 then error("instruction budget exceeded") end
  end
  debug.sethook(hook,"",1000)
  local ok,err=pcall(chunk)
  debug.sethook()
end
reproduce_case()
Вопрос 13 из 30
Какой контракт отличит эквивалентный рефакторинг от тихой поломки? Нужен основной контракт раздела «Лимиты ресурсов».
LuaLua · Лимиты ресурсов · разбор 3
do
  local budget=100000
  local function hook()
    budget=budget-1000
    if budget<=0 then error("instruction budget exceeded") end
  end
  debug.sethook(hook,"",1000)
  local ok,err=pcall(chunk)
  debug.sethook()
end
Вопрос 14 из 30
После редкого сбоя команда спорит о разделе «Лимиты ресурсов». Какой вывод должен попасть в код и тесты? Нужна эксплуатационная граница раздела «Лимиты ресурсов».
Вопрос 15 из 30
Что нельзя вывести из одного удачного примера, но нужно знать о разделе «Лимиты ресурсов»? Выберите описание, объединяющее механизм и границу раздела «Лимиты ресурсов».
Вопрос 16 из 30
Какой контракт языка проявляется в этом примере? Ответ должен описывать основной механизм раздела «Недоверенный код».
LuaLua · Недоверенный код · разбор 1
local source=read_untrusted()
assert(#source<=65536)
local chunk,err=load(source,"guest","t",env)
if not chunk then return reject(err) end
return run_isolated(chunk)
Вопрос 17 из 30
Какой крайний случай важнее всего добавить к проверке? Нужен отрицательный сценарий для раздела «Недоверенный код».
LuaLua · Недоверенный код · разбор 2
local function reproduce_case()
  local source=read_untrusted()
  assert(#source<=65536)
  local chunk,err=load(source,"guest","t",env)
  if not chunk then return reject(err) end
  return run_isolated(chunk)
end
reproduce_case()
Вопрос 18 из 30
Какой смысл фрагмента нельзя спрятать в комментарии вместо проверки? Нужен основной контракт раздела «Недоверенный код».
LuaLua · Недоверенный код · разбор 3
do
  local source=read_untrusted()
  assert(#source<=65536)
  local chunk,err=load(source,"guest","t",env)
  if not chunk then return reject(err) end
  return run_isolated(chunk)
end
Вопрос 19 из 30
Команда меняет раздел «Недоверенный код» в рабочем модуле. На какое решение можно опереться при повторном запуске и отказе зависимости? Нужна эксплуатационная граница раздела «Недоверенный код».
Вопрос 20 из 30
Какое правило раздела «Недоверенный код» стоит закрепить в тестах? Ответ должен охватывать весь раздел «Недоверенный код».
Вопрос 21 из 30
Результат здесь задаёт не соглашение проекта, а правило языка. Какое? Выберите основное правило раздела «Профилирование решения».
LuaLua · Профилирование решения · разбор 1
for _,case in ipairs(adversarial_cases) do
  local started=clock()
  local ok,err=run_with_limits(case.source,case.input)
  record(case.name,ok,clock()-started,memory_used())
end
Вопрос 22 из 30
Какую границу стоит сделать явной в регрессионной проверке? Выберите именно проверяемую границу раздела «Профилирование решения».
LuaLua · Профилирование решения · разбор 2
local function reproduce_case()
  for _,case in ipairs(adversarial_cases) do
    local started=clock()
    local ok,err=run_with_limits(case.source,case.input)
    record(case.name,ok,clock()-started,memory_used())
  end
end
reproduce_case()
Вопрос 23 из 30
Внутреннюю реализацию меняют. Что обязано остаться верным снаружи? Нужен основной контракт раздела «Профилирование решения».
LuaLua · Профилирование решения · разбор 3
do
  for _,case in ipairs(adversarial_cases) do
    local started=clock()
    local ok,err=run_with_limits(case.source,case.input)
    record(case.name,ok,clock()-started,memory_used())
  end
end
Вопрос 24 из 30
В модуле меняют «Профилирование решения» и хотят сохранить диагностируемость. Какой подход надёжнее? Ответ должен выражать проверяемое следствие раздела «Профилирование решения».
Вопрос 25 из 30
На какое утверждение можно опереться при проектировании раздела «Профилирование решения»? Ответ должен охватывать весь раздел «Профилирование решения».
Вопрос 26 из 30
Какое правило точнее всего описывает происходящее в строке «local result=worker_process:run({script=source,input=input},»? Нужна именно центральная гарантия раздела «Архитектурные компромиссы».
LuaLua · Архитектурные компромиссы · разбор 1
local result=worker_process:run({script=source,input=input},
  {cpu_ms=50,memory_mb=32,wall_ms=200})
if result.crashed then quarantine(script_id) end
Вопрос 27 из 30
Обычный запуск проходит. Какое граничное поведение обязан проверить второй тест? Нужен отрицательный сценарий для раздела «Архитектурные компромиссы».
LuaLua · Архитектурные компромиссы · разбор 2
local function reproduce_case()
  local result=worker_process:run({script=source,input=input},
    {cpu_ms=50,memory_mb=32,wall_ms=200})
  if result.crashed then quarantine(script_id) end
end
reproduce_case()
Вопрос 28 из 30
Что должно пережить замену вспомогательных функций и имён переменных? Выберите гарантию, определяющую раздел «Архитектурные компромиссы».
LuaLua · Архитектурные компромиссы · разбор 3
do
  local result=worker_process:run({script=source,input=input},
    {cpu_ms=50,memory_mb=32,wall_ms=200})
  if result.crashed then quarantine(script_id) end
end
Вопрос 29 из 30
Для раздела «Архитектурные компромиссы» выбирают между коротким трюком и ясным контрактом. Что предпочтительнее? Нужна эксплуатационная граница раздела «Архитектурные компромиссы».
Вопрос 30 из 30
Что должен помнить разработчик, впервые работающий с разделом «Архитектурные компромиссы»? Ответ должен охватывать весь раздел «Архитектурные компромиссы».

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу