Pergunta

Eu estou usando um aplicativo de código fechado que carrega scripts Lua e permite alguma personalização através da modificação destes scripts. Infelizmente essa aplicação não é muito boa em gerar saída de log útil (Tudo que eu vejo é 'script falhou') se algo der errado em um dos scripts Lua.

Eu percebo que linguagens dinâmicas são muito resistentes a análise estática de código na forma como C ++ código pode ser analisado por exemplo.

Eu estava esperando que, porém, não seria uma ferramenta que funciona através de um script Lua e exemplo adverte sobre variáveis ??que não foram definidas no contexto de um script particular.

Essencialmente, o que eu estou procurando é uma ferramenta que, por um script:

local a
print b

saída seria:

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

Ele só pode ser realmente avisos para a maioria das coisas, mas que ainda seria útil! Existe tal ferramenta um? Ou talvez um IDE Lua com um recurso como esse construção em?

Obrigado, Chris

Foi útil?

Solução

Automated análise de código estático para Lua não é uma tarefa fácil em geral. No entanto, para um conjunto limitado de problemas práticos é bastante factível.

googling para "lua lint" produz essas duas ferramentas: lua-checker e Lua fiapos .

Você pode querer rolar sua própria ferramenta para suas necessidades específicas no entanto.

Metalua é uma das ferramentas mais poderosas para análise de código Lua estática. Por exemplo, consulte metalint , a ferramenta para uso variável global análise.

Por favor, não hesite em enviar sua pergunta em Metalua lista de discussão . As pessoas lá são geralmente muito útil.

Outras dicas

Há também lua-inspecionar , que se baseia na metalua que já foi mencionado. Eu já integrou na ZeroBrane Studio IDE , o que gera uma saída muito semelhante ao que você esperaria. Veja esta resposta SO para mais detalhes:. https://stackoverflow.com/a/11789348/1442917

Para verificar globals, consulte esta lua-l postagem . Verificando os habitantes locais é mais difícil.

Você precisa encontrar um analisador para lua (deve estar disponível como open source) e usá-lo para analisar o roteiro em uma árvore AST adequada. Use essa árvore e um simples rastreador visibilidade variável para descobrir quando uma variável está ou não está definido.

Normalmente, as regras de escopo são simples:

  • começar com o nó superior AST e um âmbito vazio
  • olhar item em que a criança declarações para esse nó. Cada declaração de variável deve ser adicionado no escopo atual.
  • Se um novo escopo está começando (por exemplo através de uma {operador) criar um novo escopo de variáveis ??herdar as variáveis ??no escopo atual).
  • quando um escopo está terminando (por exemplo, através}) remover o escopo de variáveis ??criança atual e retornar para o pai.
  • Iterate cuidado.

Isto irá fornecer-lhe com o que as variáveis ??são visíveis onde dentro da AST. Você pode usar esta informação e se você também inspecionar os nós de expressões AST (leitura / escrita de variáveis) você pode descobrir suas informações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top