如何安全地从 Lua 中调用 C++ 函数

我在我的项目中使用 Sol2 并且在 Lua 中运行 C++ 函数遇到了一些麻烦。首先,我通过 sol::set_function() 将一些函数绑定到了 Lua。例如:

我有这个函数:

void PrintInt(int value){
    std::cout << "Something" << std::endl;
}

在我的主程序中我这样做:

int main() {
    sol::state state;
    state.set_function("PrintInt", &PrintInt);
}

现在如果我在 Lua 中调用此函数,它工作得很好。但是我在我的游戏代码中有一些情况可能会产生一些意外的调用,例如在 Lua 中的这个调用:

PrintInt(nil)

所有的代码都是伪代码,所以不管怎么样都没有关系。这可能是因为 Lua 脚本是由玩家编写的。所以问题是:我如何避免这种情况发生?我不想强制玩家编写各种检查等。我在 C++ 中加载和运行脚本时进行了检查,但是它没有提供任何错误信息。我使用 sol::protected_function_result 来检查错误。我尝试使用 sol::optional,但是我获得了"Cannot find class '',to resolve delegate 'optional'" 的错误信息。

点赞
用户9267705
用户9267705

感谢评论和神圣的 Sol2 文档!

解决方案非常简单明显:只需要阅读此文档:Sol2 Docs: config and safety。 之后只需像这样定义任何所需的触发器: #define SOL_SAFE_USERTYPE 1。 你的定义应该处于第一位。之后你可以包括 sol.hpp:

#define SOL_SAFE_USERTYPE 1
#include "sol.hpp"

这就是你需要做的全部。

2018-01-28 19:33:11