从Lua堆栈安全读取字符串

5
如何安全地从Lua栈中读取字符串值?函数lua_tostring和lua_tolstring都可能会引发Lua错误(longjmp /异常)。因此,这些函数应该在受保护模式下使用lua_pcall进行调用。但我找不到一个好的解决方案,如何通过C++从Lua栈获取字符串值。是否真的需要在受保护模式下使用lua_pcall调用lua_tolstring?实际上,使用lua_pcall似乎很糟糕,因为我想从Lua栈中读取的字符串是由lua_pcall存储的错误信息。
4个回答

7

在调用 lua_tostring 之前,使用 lua_type 进行检查:如果 lua_type 返回 LUA_TSTRING,则可以安全地调用 lua_tostring 获取字符串,并且不会分配任何内存。

lua_tostring 仅在需要将数字转换为字符串时才分配内存。


lua_tostring在不需要将数字转换为字符串的情况下是否保证是“nothrow”? - Juraj Blaho
谢谢,可惜这个信息不在 Lua 参考手册里。 - Juraj Blaho

2

当你调用lua_pcall失败时,它将返回一个错误代码。当你成功调用lua_pcall时,将返回零。因此,首先应该查看由lua_pcall返回的值,然后使用lua_type获取类型,最后使用lua_to*函数获取正确的值。

int iRet = lua_pcall(L, 0, 0, 0);
if (iRet)
{
    const char *pErrorMsg = lua_tostring(L, -1); // error message
    cout<<pErrorMsg<<endl;
    lua_close(L);
    return 0;
}

int iType = lua_type(L, -1);
switch (iType)
{
    //...
    case LUA_TSTRING:
        {
            const char *pValue = lua_tostring(L, -1);
            // ...
        }
}

It's all. Good luck.


0

我猜这取决于上下文。我个人会先尝试调用lua_isstring。 - d33tah

0
你可以使用lua_isstring函数来检查值是否可以无错误地转换为字符串。

1
根据Lua参考手册5.2,lua_isstring函数返回的不是能否无误转换,而是是否可以转换。仍然可能出现“内存不足”或其他未记录的错误。 - Juraj Blaho
@JurajBlaho 我同意你的观点。lua_isstring 不够安全。 - vipygd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接