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

StackOverflow https://stackoverflow.com/questions/866266

Вопрос

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

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

Это было полезно?

Решение

В целом автоматический статический анализ кода для Lua — непростая задача.Однако для ограниченного круга практических задач это вполне осуществимо.

Быстрый погуглите "lua lint" дает эти два инструмента: Lua-проверка и Луа ворс.

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

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

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

Другие советы

А также есть Lua-проверить, основанный на уже упомянутой Metalua.Я интегрировал его в ZeroBrane Studio IDE, который генерирует выходные данные, очень похожие на ожидаемые.Подробнее см. в этом ответе SO: https://stackoverflow.com/a/11789348/1442917.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top