Ну так тема узко специализированная, да и подача - что уж греха таить - довольно специфическая. Писалась она, по большому счёту, для себя - довольно много нюансов вскрывается по ходу написания объяснений. Как следствие - код дорабатывался. Такая себе форма аутосадокодревью )
Если я правильно понял вопрос, то на данном этапе из инструментов у нас есть следующее:
Запуск скриптов осуществляется через:
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();
}
}
Правда полностью стейт не восстановит - для этого всё-таки скрипты придётся по-новой запускать.
Купите две -
наобманите систему ;)Благодарю )
Ну так тема узко специализированная, да и подача - что уж греха таить - довольно специфическая. Писалась она, по большому счёту, для себя - довольно много нюансов вскрывается по ходу написания объяснений. Как следствие - код дорабатывался. Такая себе форма аутосадокодревью )
Но если кому-то ещё пригодится - буду только рад.
Спасибо за наводку. Слышал про него краем уха, но палкой потыкать так руки и не дошли, т.к. задача была изолировать именно ванильный(-ую?) Lua. Гляну.
actively malicious - Вот уж кто-то, а эти точно не одну собаку должны были съесть в части ограничений творческих порывов особо рьяных энтузиастов ))
Если я правильно понял вопрос, то на данном этапе из инструментов у нас есть следующее:
Запуск скриптов осуществляется через:
Которые возвращают sol::protected_function_result, он как раз и позволяет отлавливать ошибки.
Как для всего скрипта:
Так и для отдельных функций:
С функциями, правда чуть сложнее -- нужно явно указать, что мы хотим именно sol::protected_function_result
Ну а для перезагрузки песочницы у нас уже есть reset который автоматом подгружает библиотеки, которые были загружены в него ранее.
Правда полностью стейт не восстановит - для этого всё-таки скрипты придётся по-новой запускать.
Дык астрофаги же )
А вы последовательны )
Очень далеко не в стол! )
Спасибо огромное за весь цикл - читаю с удовольствием, уйму всего почерпнул.