2013-03-21 4 views
4

어떻게 Lua 스택에서 문자열 값을 안전하게 읽을 수 있습니까? lua_tostringlua_tolstring 함수는 모두 Lua 오류 (이상한 형식의 longjmp/예외)를 발생시킬 수 있습니다. 따라서 함수는 보호 모드에서 lua_pcall을 사용하여 호출해야합니다. 하지만 좋은 해결책을 찾을 수 없으며 Lua 스택에서 문자열 값을 C++로 가져 오는 방법을 찾을 수 없습니다. lua_pcall을 사용하여 보호 모드에서 lua_tolstring을 호출해야합니까?안전하게 Lua 스택에서 문자열 읽기

실제로는 lua_pcall을 사용하는 것이 좋지 않습니다. 왜냐하면 루아 스택에서 읽고 싶은 문자열이 lua_pcall에 저장된 오류 메시지이기 때문입니다.

답변

6

사용 lua_type : lua_type 반환 LUA_TSTRING, 당신은 안전하게 문자열을 얻을 수 lua_tostring를 호출 할 수있는 경우 전혀 기억 것 할당되어야한다.

lua_tostring은 숫자를 문자열로 변환해야 할 때만 메모리를 할당합니다.

+0

숫자에서 문자열로의 변환이 필요없는 경우 lua_tostring이 "nothrow"라는 보장이 있습니까? –

+0

@JurajBlaho, 대답을 업데이트했습니다. – lhf

+0

감사합니다.이 정보는 Lua 참조 설명서에 없습니다. –

0

lua_isstring 함수를 사용하여 값을 오류없이 문자열로 변환 할 수 있는지 확인할 수 있습니다. 여기

+1

루아 참조 설명서 5.2에 따르면'lua_isstring'은 오류없이 변환 될 수 있지만 변환 될 수 있다면 반환하지 않습니다. 여전히 "메모리 부족"또는 기타 문서화되지 않은 오류가있을 수 있습니다. –

+0

@JurajBlaho 나는 당신에 동의합니다. lua_isstring은 충분히 안전하지 않습니다. – vipygd

0

그것이 OpenTibia 서버에서 이루어집니다 방법은 다음과 같습니다

std::string LuaState::popString() 
{ 
    size_t len; 
    const char* cstr = lua_tolstring(state, -1, &len); 
    std::string str(cstr, len); 
    pop(); 
    return str; 
} 

출처 : lua_tostring 전에 https://github.com/opentibia/server/blob/master/src/lua_manager.cpp

+0

괜찮습니까? 'lua_tolstring'는 루아 오류를 낼 수 있습니다. –

+0

나는 그것이 문맥에 달려 있다고 생각한다. 나는 개인적으로 lua_isstring을 먼저 호출하려고한다. – d33tah

1

좋아, lua_pcall을 호출하지 못하면 오류 코드가 반환됩니다. lua_pcall을 성공적으로 호출하면 0이됩니다. 먼저 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); 
      // ... 
     } 
} 

모두입니다. 행운을 비네.