2015-05-25 16 views
5

Muszę bezpiecznie uruchomić sesję Lua we wbudowanym środowisku wielowątkowości, w którym stos wątków jest wstępnie przydzielony i ma stały rozmiar.Sesja Lua z ograniczonym stosem C/C++

Dozwolony jest błąd skryptu na poziomie Lua z powodu dużego zużycia stosu C/C++.
Nie można spowodować, aby cała aplikacja uległa awarii na poziomie C/C++.
Nie mogę polegać na czekach dostarczonych przez LUAI_MAXCCALLS i MAXCCALLS.

Jaki jest właściwy sposób sprawdzenia i zapobiegania potencjalnemu przepełnieniu stosu podczas sesji Lua?
Jakie jest właściwe miejsce, w którym należy przeprowadzić taką kontrolę?

+0

Czy możesz odbudować Lua z odpowiednimi wartościami "LUAI_MAXCCALLS" i "MAXCCALLS"? – lhf

+1

Niestety nie mogę. Mam rozmiar stosu zdefiniowany w bajtach i nie mogę go zmienić. I nie ma bezpośredniego mapowania z rozmiaru stosu na LUAI_MAXCCALLS i MAXCCALLS. – dlask

+0

Czy www.lua.org/manual/5.3/manual.html#4.2 (LUA_MINSTACK) może być rozwiązaniem dla Ciebie? – llogiq

Odpowiedz

0

Można zawijać funkcje C, które będą wywoływane w zewnętrznym zamknięciu C, sprawdzając stos C/C++. Zamknięcie będzie zawierać upvalue przedstawieniu rzeczywistej C-funkcja do wywołania:

CFunctionThunk(lua_state* l) 
{ 
    Check available stack space. 
    if(available stack space < minimum stack space required) 
    { 
     panic(...); 
    } 
    else 
    { 
     actualFunction = retrieve upvalue; 
     actualFunction(l); 
    } 
} 

To doda przestrzeń stos Thunk wymagane do przestrzeni stosu wymaganej przez funkcję faktycznie się powoływać, ale to powinno być małe i stały. Ponadto, przed wywołaniem Lua od samego początku, powinieneś upewnić się, że pozostała przestrzeń stosu C jest wystarczająco duża, aby pomieścić twoją Lua VM i dwie ramki stosów funkcji C (thunk + actual). Możesz zbadać wskaźnik stosu w debugerze, aby znaleźć ilość miejsca potrzebnego na thunk i Lua VM, która powinna być (mniej więcej) stała. Sprawdzanie przestrzeni stosu może również zostać zredukowane do licznika lokalnego wątku, który jest zwiększany na początku thunk i zmniejszany na końcu.

Inną możliwością jest włączenie haka debugowania Lua przy wywołaniach funkcji, sprawdzenie funkcji C w tym miejscu i sprawdzenie stosu C w razie potrzeby. Ale to najprawdopodobniej obniży wydajność środowiska wykonawczego, ponieważ hak będzie wywoływany także dla funkcji zdefiniowanych przez Lua w twoim skrypcie.

Powiązane problemy