2016-09-11 1 views
4

Я использую luacheck (в редакторе Atom), но открыт для других инструментов статического анализа.lua static analysis: определение неинициализированного поля таблицы

Есть ли способ проверить, что я использую неинициализированное поле таблицы? Я прочитал документы (http://luacheck.readthedocs.io/en/stable/index.html), но, возможно, я пропустил, как это сделать?

Во всех трех случаях в приведенном ниже коде я пытаюсь обнаружить, что я (ошибочно) использовал поле 'y1'. Ни один из них не делает. (Во время выполнения оно обнаружено, но я пытаюсь поймать его перед временем выполнения).

local a = {} 
a.x = 10 
a.y = 20 
print(a.x + a.y1)   -- no warning about uninitialized field y1 !? 

-- luacheck: globals b 
b = {} 
b.x = 10 
b.y = 20 
print(b.x + b.y1)   -- no warning about uninitialized field y1 !? 

-- No inline option for luacheck re: 'c', so plenty of complaints 
-- about "non-standard global variable 'c'." 
c = {}     -- warning about setting 
c.x = 10     -- warning about mutating 
c.y = 20     --  "  "  " 
print(c.x + c.y1)   -- more warnings (but NOT about field y1) 

Дело заключается в следующем: по мере роста проектов (файлы растут, а размер модулей число & расти), было бы неплохо, чтобы предотвратить простые ошибки, как это от ползучего в

Спасибо..

+0

https://github.com/mpeterv/luacheck/issues/46 https: // github .com/mpeterv/luacheck/issues/39 Просто его нет. – Green

+0

Спасибо - хорошо знать, что я чего-то не пропустил, и, возможно, это может быть адресовано в luacheck. –

+0

Действительно, доступ к неинициализированным полям не относится к списку проблем, которые luacheck обнаруживает: http://luacheck.readthedocs.io/en/stable/warnings.html. Я планирую работать над этим. – mpeterv

ответ

2

lua-inspect должен иметь возможность обнаруживать и сообщать об этих случаях. Я его интегрировать в ZeroBrane Studio IDE и при работе с deep analysis он сообщает следующее на этом фрагменте:

unknown-field.lua:4: first use of unknown field 'y1' in 'a' 
unknown-field.lua:7: first assignment to global variable 'b' 
unknown-field.lua:10: first use of unknown field 'y1' in 'b' 
unknown-field.lua:14: first assignment to global variable 'c' 
unknown-field.lua:17: first use of unknown field 'y1' in 'c' 

(Обратите внимание, что код интеграции сообщает только первые экземпляры этих ошибок, чтобы свести к минимуму число случаев сообщенных, я также исправлена ​​проблема, которая сообщила только о первом неизвестном экземпляре поля, поэтому вы можете использовать последний код из repository.)

+0

что я пробовал: ZeroBraneStudio Lua IDE, v1.4; Изменить/Настройки/Настройки: Пользователь с этой добавленной строкой: staticanalyzer.infervalue = false. Затем выполните Project/Analyze - я получаю жалобы на глобальные «b» и «c», но не упоминаю «y1». Я очень новый (пользователь в течение 10 минут, сейчас), так что я не правильно сделал «глубокий анализ», который вы упомянули. –

+0

@JLPLabs, используйте 'staticanalyzer.infervalue = true'. Чтобы получить отчеты о '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' –

+0

Это хорошо работает, когда таблица является локальной, а ключи постоянны, но при анализе «реального» кода я получаю множество ложных срабатываний. Похоже, что когда lua-inspect не может вывести тип значения, он выдает предупреждение каждый раз, когда он индексируется. – mpeterv