2009-05-14 3 views
10

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

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

ответ

9

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

Quick googling for "lua lint" дает следующие два инструмента: lua-checker и Lua lint.

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

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

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

1

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

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

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

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

+0

Возможно, вы имели в виду не «{» и «}» (которые служат в качестве конструктора таблиц в Lua), а ключевые слова «делать» и «завершать» (также различные конструкторы управления, такие как if-then-else, два типа циклов и т.д.). –

+0

Я понятия не имею, как выглядит язык lua ​​:-) Но я предположил, что у него есть идея «переменной области». Я действительно делал это для Java в последнее время. –

2

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

+0

Для Lua 5.2 см. Http://lua-users.org/lists/lua-l/2012-12/msg00397.html. – lhf

2

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

Смежные вопросы