проверка ошибок сценария lua

можно ли проверить, содержит ли Lua-скрипт ошибки без его выполнения? У меня есть следующий код:


    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);
    }

но если скрипт содержит ошибки, он проходит первым, если и выполняется. Я хочу знать, содержит ли он ошибки при загрузке, а не при выполнении. Возможно ли это?

3 ответов


(первоначально это было ответом на первый комментарий к вопросу Кртека, но у меня закончилось место, и, честно говоря, это работает как ответ просто отлично.)

функции по существу являются значениями, и поэтому именованная функция фактически является переменной с этим именем. Переменные, по самому их определению, могут изменяться по мере выполнения скрипта. Черт, кто-то может случайно переопределить одну из этих функций. Это плохо? Подводя итог моим мыслям: в зависимости от скрипта, параметров пройденные и / или фактические реализации тех предопределенных функций, о которых вы говорите (например, можно отключить себя или других), невозможно гарантировать работу, если вы не хотите сузить некоторые из ваших требований. Lua слишком динамична для того, что вы ищете. :)

Если вы хотите безупречный test: создайте фиктивную среду со всеми колокольчиками и свистками на месте и посмотрите, не падает ли она где-нибудь по пути (загрузка, выполнение и т. д.). Это в основном своего рода модульный тест, и как таковой будет довольно тяжелым.

Если вы хотите basic проверьте, имеет ли скрипт допустимый синтаксис: Кртек уже дал ответ на этот вопрос. Я совершенно уверен (но не на 100%), что эквивалент lua равен loadfile или loadstring, и соответствующий эквивалент C должен попробовать и lua_load() код, каждый из которых преобразует читаемый скрипт в байт-код, который вам уже нужно будет сделать, прежде чем вы сможете фактически выполнить код в своем обычном все-будет-хорошо usecase. (И если это содержало определения функций, их нужно было бы выполнить позже, чтобы код внутри них выполнялся.)

тем не менее, это степень ваших вариантов в отношении упреждающих ошибок, прежде чем они действительно произойдут. Lua - очень динамичный язык, и то, что является большой силой, также делает слабость, когда вы хотите доказать правильность. Просто слишком много переменных задействовано для идеального решения.


можно использовать компилятор LUA. Он будет компилировать только ваш файл в байт-код без его выполнения.

ваша программа также будет иметь преимущество быстрее работать, если она будет скомпилирована.

вы даже можете использовать -p возможность выполнять только проверку синтаксиса, в соответствии со связанной справочной страницей:

- p загружайте файлы, но не создавайте выходной файл. Используется в основном для проверки синтаксиса или тестирования предварительно скомпилированных фрагментов: поврежденные файлы вероятно, будет генерировать ошибки при загрузке. Для теста целостности thourough используйте-t.


в целом это невозможно, так как Lua является динамическим языком, и большинство ошибок происходит во время выполнения.

Если вы хотите проверить синтаксические ошибки, используйте . Например, я использую его как часть моего крючка предварительной фиксации.

другие распространенные ошибки запуска путем использования глобальных переменных. Вы можете проанализировать вывод luac -l чтобы поймать этих случаях. Смотрите здесь: http://lua-users.org/wiki/DetectingUndefinedVariables.

Если вы хотите что-то более продвинутое, есть несколько более или менее функциональных инструментов статического анализа для кода Lua. Начать с LuaInspect.

в любом случае, вам рекомендуется писать модульные тесты, а не просто полагаться на статические проверки кода. Меньше боли, больше выгоды.