Обновить
4K+
5

Пользователь

13
Рейтинг
3
Подписчики
Отправить сообщение

Купите две - наобманите систему ;)

Благодарю )


Ну так тема узко специализированная, да и подача - что уж греха таить - довольно специфическая. Писалась она, по большому счёту, для себя - довольно много нюансов вскрывается по ходу написания объяснений. Как следствие - код дорабатывался. Такая себе форма аутосадокодревью )

Но если кому-то ещё пригодится - буду только рад.

Спасибо за наводку. Слышал про него краем уха, но палкой потыкать так руки и не дошли, т.к. задача была изолировать именно ванильный(-ую?) Lua. Гляну.

Luau is safe to embed. Broadly speaking, this means that even in the face of untrusted (and in Roblox case, actively malicious) code [...]

actively malicious - Вот уж кто-то, а эти точно не одну собаку должны были съесть в части ограничений творческих порывов особо рьяных энтузиастов ))

Если я правильно понял вопрос, то на данном этапе из инструментов у нас есть следующее:

Запуск скриптов осуществляется через:

auto run(std::string_view script) -> sol::protected_function_result;
auto runFile(const fs::path &scriptFile) -> sol::protected_function_result;

Которые возвращают sol::protected_function_result, он как раз и позволяет отлавливать ошибки.


Как для всего скрипта:

LuaRuntime lua;
LuaSandbox sandbox(lua, LuaSandbox::Presets::Minimal);

const auto corruptedScript = R"(
  error("Huston we have a problem")
)";
auto result = sandbox.run(corruptedScript);
if (!result.valid()) {
  sol::error err = result;
  std::cerr << "lua error: " << err.what() << "\n";
  // обработка ошибки
} 

Так и для отдельных функций:

const auto trickyCorruptedScript = R"(
  function huston()
    error("Huston we have a problem")
  end
)";

auto result = sandbox.run(trickyCorruptedScript);
if (!result.valid()) {...} // Эту проверку пройдёт

auto fnResult = sandbox["huston"](); // Вызов функции
if (!fnResult.valid()) {...} // <-- А здесь уже не проскочит

С функциями, правда чуть сложнее -- нужно явно указать, что мы хотим именно sol::protected_function_result

// Либо глобально включать соответствующую опцию sol2
#define SOL_ALL_SAFETIES_ON 1

// Либо явно указывать ожидаемый тип результата
sol::protected_function_result fnResult = sandbox["huston"]();

Ну а для перезагрузки песочницы у нас уже есть reset который автоматом подгружает библиотеки, которые были загружены в него ранее.

void LuaSandbox::reset(bool doCollectGrbg /* = false */)
{
    sandbox = sol::environment(lua->state, sol::create);
    sandbox["_G"] = sandbox;

    if (loadedLibs.empty()) {
        // Для конструктора используем список из пресета.
        loadLibs(sandboxPresets.at(preset));
    } else {
        // Если же инкарнация уже не первая, то грузим всё, что было в прошлой жизни.
        loadLibs(loadedLibs);
    }
    // Принудительная уборка мусора, в случае необходимости
    if (doCollectGrbg) {
        lua->state.collect_garbage();
    }
}

Правда полностью стейт не восстановит - для этого всё-таки скрипты придётся по-новой запускать.

загадочное инфракрасное свечение

Дык астрофаги же )

Я гналась за вами три дня чтобы сказать как вы мне безразличны

Весь этот бред разбирать не вижу никакого смысла. Это просто мусор.  (c) cdriper

А вы последовательны )

Очень далеко не в стол! )

Спасибо огромное за весь цикл - читаю с удовольствием, уйму всего почерпнул.

Информация

В рейтинге
578-й
Откуда
Россия
Зарегистрирован
Активность