lua-Skript-Fehler überprüfen
Ist es möglich zu überprüfen, ob ein lua-script enthält Fehler, ohne es auszuführen? Ich habe fallowing code:
if(luaL_loadbuffer(L, data, size, name))
{
fprintf (stderr, "%s", lua_tostring (L, -1));
lua_pop (L, 1);
}
if(lua_pcall(L, 0, 0, 0))
{
fprintf (stderr, "%s", lua_tostring (L, -1));
lua_pop (L, 1);
}
Aber wenn das Skript Fehler enthält, es geht zuerst und wenn es ausgeführt wird. Ich möchte wissen, ob es Fehler enthält, wenn ich laden Sie es, nicht wenn ich es ausführen. Ist das möglich?
- Nein, nicht möglich
- Wir können nicht nach unten-vote einen Kommentar, aber wenn du bei google nach "Lua-lint" Sie könnten Ihre Meinung ändern, dass
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Dies war ursprünglich als eine Antwort auf den ersten Kommentar zu Krtek Frage, aber ich lief aus dem Raum und um ehrlich zu sein funktioniert es als eine Antwort einfach nur gut.)
Funktionen sind im wesentlichen Werte, und damit eine benannte Funktion ist eigentlich eine variable mit diesem Namen. Variablen, nach Ihrer definition, ändern kann, wie ein Skript ausgeführt wird. Hölle, könnte jemand versehentlich neu definieren diese Funktionen hat. Ist das schlimm? Um die Summe meiner Gedanken: je nach script Parameter übergeben wird, und/oder tatsächlichen Implementierungen dieser vordefinierten Funktionen, die Sie sprechen (man könnte unset sich selbst oder andere Personen, zum Beispiel), ist es unmöglich zu garantieren, dass die Dinge funktionieren, es sei denn, Sie sind bereit zu verengen einige Ihrer Forderungen. Lua ist zu dynamisch für das, was Sie suchen. 🙂
Wenn Sie möchten, eine einwandfreie test: erstellen Sie eine dummy-Umgebung mit allen Glocken und Trillerpfeifen in Ort, und sehen, ob es stürzt ab, irgendwo auf dem Weg (laden, ausführen, etc). Dies ist im Grunde eine Art von unit-Tests, und als solche wäre Recht schwer.
Wenn Sie möchten, eine basic-check, um zu sehen, wenn ein Skript über eine gültige syntax: Krtek gab eine Antwort bereits. Ich bin mir ziemlich sicher (aber nicht 100%), dass die lua-äquivalent ist zu
loadfile
oderloadstring
, und die jeweiligen C äquivalent ist zu versuchen und zulua_load()
den code, von denen jedes konvertieren lesbaren script bytecode, das würden Sie schon tun müssen, bevor Sie könnte tatsächlich führen Sie den code in Ihrem normalen alles-ist-gut Anwendungsfall. (Und wenn die Funktion Definitionen, die ausgeführt werden müssen, später für den code innerhalb diese ausführen.)Diese sind jedoch der Umfang der Optionen im Hinblick auf die Vorwegnahme von Fehlern, bevor Sie tatsächlich passieren. Lua ist eine sehr dynamische Sprache ist, und was eine große Stärke macht auch für eine Schwäche, wenn Sie wollen, um zu beweisen Korrektheit. Es gibt einfach zu viele Variablen, die für eine perfekte Lösung.
GenerateStub(param1type, param2type, ...)
Funktion, die erstellt und gibt eine Funktion wirft Fehler, wenn eine oder mehrere der Parameter sind nicht der richtige Typ. So könnte man überprüfen, für mehr als eine Funktion Existenz: Sie können überprüfen, ob der angegebene Parameter werden von richtigen Typen mit einem Risiko von falschen Fehlern. Beispiel: wenn eine echte Funktion angeblich füllt eine Tabelle mit zahlen, wenn einem anderen übergibt einen Wert aus, um eine stub-Funktion, Ihren test bestehen würde, nil (und nicht eine Zahl!) die dann bewirkt, dass die stub-fälschlicherweise-Fehler aus.Können Sie die LUA-Compiler. Es wird nur kompilieren Sie die Datei in bytecode, ohne Sie auszuführen.
Ihrem Programm haben auch den Vorteil, die schneller laufen, wenn es kompiliert wird.
Können Sie sogar die
-p
option, um nur eine syntax-Prüfung, nach der verlinkten man page :Es ist im Allgemeinen nicht möglich, da Lua ist eine dynamische Sprache, und die meisten Fehler passieren in der runtime.
Wenn Sie wollen überprüfen Sie die syntax-Fehler, verwenden Sie
luac -p
option. Ich benutze es als ein Teil meiner pre-commit-hook zum Beispiel.Andere häufige Fehler auslösen, durch Missbrauch der globalen Variablen. Sie können analysieren Ausgabe von
luac -l
zu fangen, diesen Fällen. Siehe hier: http://lua-users.org/wiki/DetectingUndefinedVariables.Wenn Sie etwas weiter Fortgeschritten, es gibt mehrere mehr-oder-weniger funktionale, statische Analyse-tools für Lua-code. Beginnen Sie mit LuaInspect.
In jedem Fall empfehlen wir Ihnen, Sie zu schreiben unit-tests, anstatt nur unter Berufung auf statische code-Prüfungen. Weniger Schmerzen, mehr Gewinn.