Estou acostumado a ter meu compilador reclamando quando faço algo estúpido como um erro de digitação no nome de uma variável, mas o JavaScript tem o hábito de deixar isso passar.
Existe alguma ferramenta de análise estática para JavaScript?
Estou acostumado a ter meu compilador reclamando quando faço algo estúpido como um erro de digitação no nome de uma variável, mas o JavaScript tem o hábito de deixar isso passar.
Existe alguma ferramenta de análise estática para JavaScript?
Respostas:
Eu concordo que JSLint é o melhor lugar para começar. Observe que JavaScript Lint é diferente de JSLint . Eu também sugiro verificar o JSure , que em meu teste limitado foi melhor do que qualquer um deles, embora com algumas arestas na implementação - a versão do Intel Mac travou na inicialização para mim, embora a versão do PowerPC funcionasse bem mesmo na Intel, e a versão do Linux também funcionou bem. (O desenvolvedor, Berke Durak, disse que entraria em contato comigo quando isso fosse consertado, mas não tive notícias dele.)
Não espere tanto da análise estática de JavaScript quanto de um bom verificador C. Como Durak me disse, “qualquer análise não trivial é muito difícil devido à natureza dinâmica do Javascript”.
(Outro bug ainda mais obscuro apenas para Mac, desta vez com o widget Konfabulator do JSLint: arrastar um ícone de documento BBEdit para o widget move o documento para a lixeira. O desenvolvedor, Douglas Crockford, não experimentou o widget em um Mac.)
10 de agosto de 2009: Hoje no Simpósio de Análise Estática , Simon Holm Jensen apresentou um artigo sobre TAJS: Type Analyzer for JavaScript , escrito com Anders Møller e Peter Thiemann. O jornal não menciona as ferramentas acima, mas Jensen me disse que olhou algumas delas e não ficou impressionado. O código para TAJS deve estar disponível neste verão.
RESPOSTA ATUALIZADA, 2017: Sim. Use ESLint. http://eslint.org
Além do JSLint (já mencionado na resposta do Flash Sheridan ) e do compilador Closure (mencionado anteriormente na resposta de awhyte ), também obtive muitos benefícios executando JSHint e PHP CodeSniffer . A partir de 2012, todas as quatro ferramentas são de código aberto gratuito e têm uma grande e ativa comunidade de desenvolvedores por trás delas. Cada um deles é um pouco diferente (e eu acho, complementar) nos tipos de verificações que realizam:
JSLint foi projetado para ser, e ainda é a ferramenta pessoal de linting de Douglas Crockford. Ele vem com um ótimo conjunto de regras padrão - o próprio Crockford, constantemente atualizado à medida que ele continua a aprender sobre JavaScript e suas armadilhas. JSLint é altamente opinativo e isso geralmente é visto como uma coisa boa. Portanto, há (intencionalmente) uma quantidade limitada que você pode fazer para configurar ou desabilitar regras individuais. Mas isso pode dificultar a aplicação do JSLint ao código legado.
JSHint é muito semelhante ao JSLint (na verdade, começou como bifurcação JSLint), mas é mais fácil / possível configurar ou desabilitar todas as verificações de JSLint por meio de opções de linha de comando ou por meio de um .jshintrc
arquivo .
Gosto particularmente de poder dizer ao JSHint para relatar todos os erros em um arquivo, mesmo se houver centenas de erros. Por outro lado, embora o JSLint tenha uma maxerr
opção de configuração, ele geralmente se recuperará relativamente cedo ao tentar processar arquivos que contêm um grande número de erros.
O compilador Closure é extremamente útil porque, se o código não compilar com o Closure, você pode ter certeza de que o código está profundamente armazenado de alguma maneira fundamental. A compilação de encerramento é possivelmente a coisa mais próxima que existe no mundo JS de uma verificação de sintaxe de "interpretador" como php -l
ouruby -c
O fechamento também avisa sobre possíveis problemas , como parâmetros ausentes e variáveis não declaradas ou redefinidas. Se você não estiver vendo os avisos esperados, tente aumentar o nível de aviso invocando Closure com uma opção de--warning_level VERBOSE
PHP CodeSniffer pode analisar JavaScript , bem como PHP e CSS. CodeSniffer vem com vários padrões de codificação diferentes, (digamos, phpcs -i
para vê-los) que incluem muitos sniffs úteis para código JavaScript, incluindo verificações contra estruturas de controle inline e espaços em branco supérfluos .
Aqui está uma lista de farejadores de JavaScript disponíveis no PHP CodeSniffer a partir da versão 1.3.6 e aqui está um conjunto de regras personalizado que permitiria a você executá-los todos de uma vez. Usando conjuntos de regras personalizados, é fácil escolher as regras que você deseja aplicar. E você pode até mesmo escrever seus próprios sniffs se quiser impor um "estilo caseiro" particular que não tem suporte desde o início. Afaik CodeSniffer é a única ferramenta das quatro mencionadas aqui que suporta a personalização e a criação de novas regras de análise estática. Porém, uma advertência: CodeSniffer também é o que executa mais lentamente de todas as ferramentas mencionadas.
O compilador JS "Closure" do Google produz avisos e erros configuráveis em tempo de compilação. Definitivamente encontra variáveis e métodos com erros ortográficos, além de erros de aridade. Se você estiver disposto a escrever JsDoc da maneira Closure, ele também pode fazer muito com informações de tipo.
A ferramenta YUI "Compressor" também pode produzir avisos, mas ainda não tentei.
Não tive muita sorte com o IDE Aptana, construído no Eclipse, mas outras pessoas gostam dele. Consulte a discussão do Stack Overflow sobre JS IDEs.
O IDE IntelliJ, que não é gratuito da última vez que verifiquei, tem um suporte excelente para JS. Ele detectará e destacará vars e métodos com erros ortográficos enquanto você digita e muito mais. Também tem preenchimento automático.
Em resumo, JSLint, JSHint, Plato, ESLint, Google Closure-Linter são as ferramentas disponíveis. Eu enfrentei problemas de instalação ao experimentar o Google Closure-Linter para Windows. Mas, ele menciona na página da web que seu suporte para Windows é experimental. Encontrei e experimentei outra ferramenta que funciona bem. Aqui está o link para isso: http://esprima.org/
Além disso, este é o link do github para a ferramenta Esprima: https://github.com/ariya/esprima
Você pode ver algumas ferramentas para análise de código estático JavaScript neste Wiki .
Uma ferramenta no Wiki, mas não mencionada nesta postagem, é o DeepScan . Seu foco é encontrar erros de tempo de execução e problemas de qualidade, em vez de convenções de codificação de linters. Abrange também TypeScript, React e Vue.js.
Você pode testá-lo em seu projeto GitHub.
Experimentei o ESlint e achei bom ... você também pode adicionar regras personalizadas lá ... Aqui está o repositório github: https://github.com/nzakas/eslint e aqui está a introdução a ele: http: // www. nczonline.net/blog/2013/07/16/introducing-eslint/
Mais focado em segurança do que uma lista de propósito geral pode ser encontrado no Mozilla Wiki em Security / B2G / JavaScript code analysis
O objetivo deste documento é coletar ferramentas de análise de código JavaScript adequadas para inclusão em projetos Mozilla futuros ou para uso interno.
Além disso, há pelo menos um produto comercial que faz análise de segurança: Burp obtém novos recursos de análise de JavaScript
A versão mais recente do Burp inclui um novo mecanismo para análise estática de código JavaScript. Isso permite que o Burp Scanner relate uma série de novas vulnerabilidades, incluindo:
- XSS baseado em DOM
- Injeção de JavaScript
- Injeção de SQL do lado do cliente
- WebSocket hijacking
- Manipulação de caminho de arquivo local
- Redirecionamento aberto baseado em DOM
- Manipulação de cookies
- Manipulação de cabeçalho de solicitação Ajax
- Negação de serviço baseada em DOM
- Manipulação de mensagens na web
- Manipulação de armazenamento HTML5
No domínio comercial, a Análise Estática de Coverity suporta a análise de JavaScript a partir da versão 7.7 (meados de 2015). Com relação à sua pergunta específica sobre erros de digitação, meu projeto favorito que aparece na versão mais recente (8.0, início de 2016) encontra erros de digitação em nomes de elementos do programa.
Como um desenvolvedor chave no projeto, por favor, aceite meu plug-in desavergonhado: embora ainda não seja tão maduro quanto a venerada análise C / C ++ , a análise JavaScript da Coverity compartilha muito do mesmo mecanismo, com o mesmo foco em encontrar defeitos de alto valor com um baixo taxa de relatórios de defeitos falsos positivos. Estamos aumentando nosso foco em encontrar defeitos de segurança em JavaScript (e outras linguagens), além de encontrar erros gerais de programação.
Agora, aqui estão alguns erros de digitação encontrados (erro de digitação exato deixado como um exercício para o leitor, para enfatizar a facilidade com que podem ser esquecidos):
merge.js: (link estável) (última revisão)
comandos-pacotes-query.js: (link estável) (última revisão)
series-pie-tests.js: (link estável) (última revisão)
esboço_case.js: (link estável) (última revisão)
Eu gosto do Jslint para esse tipo de coisa ...
O Flow faz análises estáticas com e sem anotações.
Se você precisar de anotações, a sintaxe é compatível com TypeScript .
Instale o pacote com:
npm install --global flow-bin
Existem também algumas ferramentas. Dê uma olhada em gulp-flowtype e talvez SublimeLinter-flow
JSAnalyse acaba de ser publicado no codeplex. É uma ferramenta que analisa as dependências entre arquivos javascript. Você pode até definir as dependências permitidas e o JSAnalysis verifica se as regras definidas foram cumpridas ou não. Isso permite acompanhar as dependências do javascript mesmo em grandes projetos e ter uma arquitetura limpa.
O JSAnalyse pode ser executado como uma ferramenta de linha de comando ou configurado por meio do Visual Studio Layer Diagramm. Também é fácil de integrar na construção. Com check-ins bloqueados, você pode manter as dependências sob controle.
Nosso SD ECMAScript CloneDR é uma ferramenta para encontrar cópias exatas e quase erradas de código duplicado em grandes bases de código-fonte JavaScript.
Ele usa a sintaxe da linguagem para orientar a detecção, de modo que encontrará clones apesar das mudanças de formato, comentários inseridos / excluídos, variáveis renomeadas e até mesmo algumas instruções inseridas / excluídas.
O site tem um exemplo de CloneDR executado na biblioteca Closure do Google.
Divulgação completa, estou por trás disso: http://www.toptensoftware.com/minime que faz minificação, ofuscação e um conjunto razoável de verificações de estilo de lint.