проверка ошибок скрипта 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);
}</code></pre>

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

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

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

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

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

Комментарии (3)
Решение

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

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

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

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

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

Комментарии (2)

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

Если вы хотите проверить синтаксические ошибки, используйте опцию luac -p. Я, например, использую ее как часть моего pre-commit hook.

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

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

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

Комментарии (0)