статический анализ кода Lua на наличие потенциальных ошибок - PullRequest
10 голосов
/ 15 мая 2009

Я использую приложение с закрытым исходным кодом, которое загружает сценарии 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 со встроенной функцией?

Спасибо, Крис

Ответы [ 4 ]

9 голосов
/ 15 мая 2009

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

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

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

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

Пожалуйста, не стесняйтесь размещать свой вопрос в Список рассылки Metalua . Люди там обычно очень полезны.

3 голосов
/ 23 сентября 2012

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

2 голосов
/ 18 мая 2009

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

1 голос
/ 15 мая 2009

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

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

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

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

...