статический анализ кода Lua на предмет потенциальных ошибок

Я использую приложение с закрытым исходным кодом, которое загружает сценарии Lua и допускает некоторую настройку путем изменения этих сценариев. К сожалению, это приложение не очень хорошо генерирует полезный вывод журнала (все, что я получаю, это «ошибка сценария»), если что-то пойдет не так в одном из сценариев Lua.

Я понимаю, что динамические языки в значительной степени устойчивы к статическому анализу кода так, как, например, можно анализировать код C ++.

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

По сути, я ищу инструмент, который для скрипта:

local a
print b

выведет:

warning: script.lua(1): local 'a' is not used'
warning: script.lua(2): 'b' may not be defined'

На самом деле это может быть только предупреждение о большинстве вещей, но оно все равно будет полезно! Такой инструмент существует? Или, может быть, Lua IDE с такой встроенной функцией?

Спасибо Крис


person Chris    schedule 14.05.2009    source источник


Ответы (5)


Автоматический статический анализ кода для Lua - вообще непростая задача. Однако для ограниченного набора практических задач это вполне выполнимо.

Быстрый поиск в Google для "lua lint" дает следующие два инструмента: lua-checker и Lua lint.

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

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

Не стесняйтесь задавать свой вопрос в списке рассылки Metalua. Люди там обычно очень отзывчивые.

person Alexander Gladysh    schedule 14.05.2009

Также существует lua-inspect, основанный на уже упоминавшейся metalua. Я интегрировал его в ZeroBrane Studio IDE, которая генерирует результат, очень похожий на то, что вы ожидаете. Подробнее см. В этом SO-ответе: https://stackoverflow.com/a/11789348/1442917.

person Paul Kulchenko    schedule 23.09.2012

Для проверки глобальных переменных см. это сообщение lua-l . Проверить местных жителей сложнее.

person lhf    schedule 18.05.2009

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

Обычно правила определения объема просты:

  • начать с верхнего узла AST и пустой области
  • item посмотрите дочерние операторы для этого узла. Каждое объявление переменной должно быть добавлено в текущую область видимости.
  • если начинается новая область видимости (например, с помощью оператора {), создайте новую область видимости переменной, наследуя переменные в текущей области).
  • когда область видимости заканчивается (например, через}), удалите текущую область дочерней переменной и вернитесь к родительской.
  • Тщательно повторяйте.

Это даст вам представление о том, какие переменные видны внутри AST. Вы можете использовать эту информацию, и если вы также проверите узлы AST выражений (чтение / запись переменных), вы можете узнать свою информацию.

person Mihai Toader    schedule 14.05.2009
comment
Вы, вероятно, имели в виду не {и} (которые служат в качестве конструктора таблиц в Lua), а ключевые слова do и end (а также различные управляющие конструкции, такие как if-then-else, два типа циклов for и т. Д.). - person Alexander Gladysh; 15.05.2009
comment
Я понятия не имею, как выглядит язык lua ​​:-) Но я предположил, что он имеет некоторое представление о области видимости переменных. На самом деле я недавно делал такие вещи для Java. - person Mihai Toader; 15.05.2009

Я только начал использовать luacheck, и это превосходно!

Первый выпуск был с 2015 года.

person Norman Ramsey    schedule 04.04.2021