Статический анализ кода Lua на возможные ошибки

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

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

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

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

local a
print b

выводит:

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

Существует также lua-inspect, который основан на metalua, о котором уже упоминалось. Я интегрировал его в ZeroBrane Studio IDE, который генерирует вывод, очень похожий на то, что вы ожидаете. Подробнее см. Этот ответ: fooobar.com/questions/508095/....

Ответ 4

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

Обычно правила обзора очень просты:

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

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