2015-05-25 20 views
5

Lua oturumunu, iş parçacığı yığınının önceden ayrılmış ve sabit boyutta olduğu gömülü çoklu iş parçacığı ortamında güvenli bir şekilde çalıştırmam gerekir.Sınırlı C/C++ yığını olan Lua oturumu

Yüksek C/C++ yığın tüketimi nedeniyle komut dosyasının Lua düzeyinde başarısız olmasına izin verilir.
Tüm uygulamanın C/C++ düzeyinde çökmesine izin verilmiyor.
LUAI_MAXCCALLS ve MAXCCALLS tarafından sağlanan kontrollere güvenemem.

Lua oturumunun herhangi bir potansiyel yığın taşmasını kontrol etmek ve önlemek için doğru yol nedir?
Böyle bir kontrolün gerçekleştirileceği doğru yer neresidir?

+0

Lua'yı 'LUAI_MAXCCALLS' ve 'MAXCCALLS' değerleri ile yeniden yapılandırabilir misiniz? – lhf

+1

Maalesef yapamıyorum. Bayt cinsinden tanımlanmış yığın boyutuna sahibim ve değiştiremiyorum. Ve yığın boyutundan LUAI_MAXCCALLS ve MAXCCALLS için doğrudan eşleme yoktur. – dlask

+0

www.lua.org/manual/5.3/manual.html#4.2 (LUA_MINSTACK) sizin için bir çözüm olabilir mi? – llogiq

cevap

0

C/C++ yığınınızı kontrol eden bir dış C kapanışı içinde çağrılacak C işlevlerini sarabilirsiniz. kapatma çağrılacak fiili C- işleve başvuran bir upvalue içerecektir: çağrılacak

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

Bu aslında işlev tarafından gerekli yığın alanı için gerekli thunk ait yığın boşluk eklemek, ancak bu küçük olmalı ve sabiti. Ayrıca, Lua'yı en baştan çağırmadan önce, kalan C-yığını alanının, Lua VM'nizi ve C-işlevi yığın çerçevelerinden ikisini (thunk + gerçek) içerecek kadar büyük olduğundan emin olmalısınız. Bir hata ayıklayıcısındaki yığın işaretçisini, (az ya da çok) sabit olması gereken thunk ve Lua VM için gerekli alan miktarını bulmak için araştırabilirsiniz. Yığın alanı kontrolü ayrıca, thunk'ın başlangıcında artan ve sonunda azaltılmış bir iş parçacığı yerel sayaca da indirgenebilir.

Başka bir olasılık, bir Lua hata ayıklama kancasını işlev çağrıları üzerinde etkinleştirmek, orada C-işlevlerini kontrol etmek ve gerekirse C yığını kontrolünü yapmak olabilir. Ancak bu, çalışma zamanı performansını bozar çünkü çengel, betiğinizdeki Lua tanımlı işlevler için de çağrılır.