analizzare staticamente il codice Lua per i potenziali errori
-
21-08-2019 - |
Domanda
Sto utilizzando un'applicazione closed-source che carica gli script Lua e permette qualche personalizzazione attraverso la modifica di questi script. Purtroppo che l'applicazione non è molto bravo a generare output del log utile (tutto quello che ottiene è 'scrittura fallita') se qualcosa va storto in uno degli script Lua.
Mi rendo conto che i linguaggi dinamici sono più o meno resistenti alle analisi statica del codice nel modo C ++ codice può essere analizzato per esempio.
Speravo, però, ci sarebbe stato uno strumento che attraversa uno script Lua e per esempio avverte sulle variabili che non sono state definite nel contesto di un particolare script.
In sostanza quello che sto cercando è uno strumento che per uno script:
local a
print b
uscita sarebbe:
warning: script.lua(1): local 'a' is not used'
warning: script.lua(2): 'b' may not be defined'
Si può veramente solo essere avvertenze per la maggior parte delle cose, ma che sarebbe comunque utile! Se un tale strumento esiste? O forse un IDE Lua con una caratteristica come quella configurazione in?
Grazie, Chris
Soluzione
analisi statica del codice automatico per Lua non è un compito facile in generale. Tuttavia, per una serie limitata di problemi pratici è abbastanza fattibile.
googling per "lua lint" produce questi due strumenti: lua-checker e Lua pelucchi .
Si consiglia di rotolare il proprio strumento per le vostre esigenze specifiche tuttavia.
Metalua è uno dei più potenti strumenti per l'analisi del codice Lua statica. Ad esempio, consulta metalint , lo strumento per l'utilizzo variabile globale analisi.
Si prega di non esitare a pubblicare la tua domanda su Metalua mailing list . Le persone ci sono di solito molto utile.
Altri suggerimenti
C'è anche lua-ispezionare , che si basa su metalua che è stato già detto. Ho integrato in ZeroBrane Studio IDE , che genera una potenza molto simile a quello che ci si aspetterebbe. Vedere questo SO rispondere per i dettagli:. https://stackoverflow.com/a/11789348/1442917
Per il controllo globali, vedere questo lua-l invio . Controllo gente del posto è più difficile.
Hai bisogno di trovare un parser per lua (dovrebbe essere disponibile come open source) e utilizzarlo per analizzare lo script in un vero e proprio albero di AST. Utilizzare quell'albero e un semplice inseguitore visibilità variabile per scoprire quando una variabile è o non è definita.
Di solito le regole di scoping sono semplici:
- inizia con il nodo AST superiore e un ambito vuoto
- voce guardare le dichiarazioni del bambino per quel nodo. Ogni dichiarazione di variabile deve essere aggiunto nell'ambito corrente.
- se un nuovo ambito sta iniziando (per esempio tramite un operatore {) creare un nuovo ambito variabile ereditare le variabili nell'ambito corrente).
- quando un ambito sta finendo (ad esempio mediante}) togliere il bambino corrente scope delle variabili e tornare al genitore.
- Scorrere con attenzione.
Questo vi fornirà quali variabili sono visibili in cui all'interno della AST. È possibile utilizzare queste informazioni e se si ispezionare anche i nodi espressioni AST (lettura / scrittura di variabili) si possono trovare le informazioni.