Я привык к тому, что мой компилятор жалуется, когда я делаю что-то глупое, как опечатка имени переменной, но JavaScript имеет привычку пропускать этот пропуск.
Существуют ли какие-либо инструменты статического анализа для JavaScript?
Я привык к тому, что мой компилятор жалуется, когда я делаю что-то глупое, как опечатка имени переменной, но JavaScript имеет привычку пропускать этот пропуск.
Существуют ли какие-либо инструменты статического анализа для JavaScript?
Я согласен с тем, что JSLint - лучшее место для начала. Обратите внимание, что JavaScript Lint отличается от JSLint. Id также предлагает проверить JSure, который в моем ограниченном тестировании лучше, чем любой из них, хотя и с некоторыми грубыми краями в реализации. Версия Intel Mac упала при запуске для меня, хотя версия PowerPC отлично работала даже на Intel, а версия Linux тоже прекратилась. (Разработчик Berke Durak сказал, что он вернется ко мне, когда это будет исправлено, но я не слышал от него.)
Не ожидайте столько от статического анализа JavaScript, сколько вы получите от хорошего C checker. Как сказал мне Дурак, "любой нетривиальный анализ очень сложный из-за динамической природы Javascript".
(Еще одна, еще более непонятная ошибка только для Mac, на этот раз с виджетами JSLints Konfabulator: перетаскивание значка документа BBEdit на виджет перемещает документ в корзину. Разработчик, Дуглас Крокфорд, не пробовал виджет на Mac. )
10 августа 2009 года: Сегодня на Симпозиум по статическому анализу Симон Холм Йенсен представил документ TAJS: Анализатор типов для JavaScript, написанный Андерсом Мёллером и Питером Тиаманом. В документе не упоминаются вышеупомянутые инструменты, но Дженсен сказал мне, что он посмотрел на некоторых из них и не был впечатлен. Код для TAJS должен быть доступен уже этим летом.
ОБНОВЛЕННЫЙ ОТВЕТ, 2017: Да. Используйте ESLint. http://eslint.org
В дополнение к JSLint (уже упоминалось в ответ Flash Sheridan) и Closure компилятор (ранее упоминавшийся в awhyte answer) У меня также есть получил большую выгоду от запуска JSHint и PHP CodeSniffer. С 2012 года все четыре инструмента являются бесплатными с открытым исходным кодом и имеют большое и активное сообщество разработчиков. Они кажутся немного разными (и, я думаю, дополнительными) в тех типах проверок, которые они выполняют:
JSLint был разработан, и до сих пор является личным инструментом для литья Дугласа Крокфорда. Он поставляется с большим набором правил по умолчанию - Crockford own, постоянно обновляется, поскольку он продолжает изучать о JavaScript и его подводных камнях. JSLint сильно упрямый, и это обычно считается хорошим. Таким образом, существует (намеренно) ограниченная сумма, которую вы можете сделать, чтобы настроить или отключить отдельные правила. Но это может затруднить применение JSLint к устаревшему коду.
JSHint очень похож на JSLint (на самом деле он начал жизнь как вилка JSLint), но это проще/возможно настроить или отключить все проверки JSLint через параметры командной строки или через .jshintrc
.
Мне особенно нравится, что я могу сообщить JSHint сообщать обо всех ошибках в файле, даже если есть сотни ошибок. Напротив, хотя JSLint имеет параметр конфигурации maxerr
, он, как правило, выдается относительно рано при попытке обрабатывать файлы, содержащие большое количество ошибок.
Компилятор Closure чрезвычайно полезен в том, что если код не будет компилироваться с помощью Closure, вы можете чувствовать себя уверенно, что этот код глубоко запущен каким-то фундаментальным способом. Компиляция Closure, возможно, самая близкая вещь, которая есть в мире JS для проверки синтаксиса "интерпретатор", например, php -l
или ruby -c
Закрытие также предупреждает вас о потенциальных проблемах, таких как отсутствующие параметры и необъявленные или переопределенные переменные. Если вы не видите ожидаемых предупреждений, попробуйте увеличить уровень предупреждения, вызвав Closure с помощью опции --warning_level VERBOSE
PHP CodeSniffer может анализировать JavaScript, а также PHP и CSS. CodeSniffer поставляется с несколькими различными стандартами кодирования (например, phpcs -i
, чтобы увидеть их), которые включают множество полезных нюхов для кода JavaScript, включая проверки встроенных структур управления и лишние пробелы.
Вот список флюидов JavaScript, доступных в PHP CodeSniffer с версии 1.3.6, и вот настраиваемый набор правил, который позволит вам запускать их все одновременно. Используя собственные наборы правил, легко выберите и выберите правила, которые вы хотите применить. И даже напишите свои собственные нюансы, если вы хотите применить определенный "домашний стиль", который не поддерживается из коробки. Afaik CodeSniffer - единственный инструмент из четырех упомянутых здесь, который поддерживает настройку и создание новых правил статического анализа. Одно из предостережений: CodeSniffer также является самым медленным из всех упомянутых инструментов.
Компилятор JS Google Closure создает настраиваемые предупреждения и ошибки во время компиляции. Он определенно находит ошибочные переменные и методы, а также ошибки arity. Если вы хотите написать JsDoc The Closure, он также может многое сделать с информацией о типе.
Инструмент "Компрессор" YUI также может создавать предупреждения, но еще не пробовал его.
Мне не очень повезло с Aptana IDE, построенной на Eclipse, но другим нравится. См. Обсуждение JS IDE.
IntelliJ IDE, которая не является бесплатной последней проверкой, имеет отличную поддержку JS. Он будет обнаруживать и выделять орфографические ошибки и методы по мере ввода и многое другое. Он также получил автозаполнение.
Таким образом, доступны инструменты JSLint, JSHint, Plato, ESLint, Google Closure-Linter. Я столкнулся с проблемами установки, пытаясь проверить Google Closure-Linter для Windows. Но на веб-странице упоминается, что поддержка Windows является экспериментальной. Я нашел и попробовал другой инструмент, который хорошо работает. Вот ссылка на это: http://esprima.org/
Кроме того, это ссылка github для инструмента Esprima: https://github.com/ariya/esprima
Я попробовал ESLint и нашел, что это хорошо.. вы также можете добавить туда собственные правила. Вот репозиторий github: https://github.com/nzakas/eslint и вот введение к нему: http://www.nczonline.net/blog/2013/07/16/introducing-eslint/
Больше внимания с точки зрения безопасности, чем список общего назначения, можно найти в Mozilla Wiki по адресу Анализ кода безопасности /B 2G/JavaScript
Цель этого документа - собрать анализ кода JavaScript инструменты, подходящие для включения в ближайшие проекты Mozilla или для внутреннее использование.
Также существует хотя бы один коммерческий продукт, который анализирует безопасность: Burp получает новые возможности анализа JavaScript
Последняя версия Burp включает новый движок для статического анализа кода JavaScript. Это позволяет Burp Scanner сообщать о множестве новых уязвимостей, в том числе:
- XSS на основе DOM
- JavaScript-инъекция
- SQL-инъекция на стороне клиента
- Улавливание WebSocket
- Локальный путь к файлу
- Открытое перенаправление на основе DOM
- Использование файлов cookie
- Обработка заголовка запроса Ajax
- Отказ от обслуживания на основе DOM
- Обработка веб-сообщений.
- Обработка содержимого HTML5
Мне нравится Jslint для такого рода вещей...
В коммерческой сфере Статический анализ покрытия поддерживает анализ JavaScript с версии 7.7 (в середине 2015 года), Что касается вашего конкретного запроса о опечатках, мой любимый проект, появляющийся в последней версии (8.0, начало 2016 года) , находит опечатки в именах программных элементов.
Как ключевой разработчик проекта, примите мой бесстыдный плагин: хотя он еще не созрел, как почитаемый анализ C/С++, Coverity Анализ JavaScript разделяет большую часть одного и того же движка, с тем же фокусом на поиск высокоценных дефектов с низкой скоростью ложных положительных отчетов о дефектах. Мы уделяем больше внимания обнаружению дефектов безопасности в JavaScript (и других языках) в дополнение к поиску общих ошибок программирования.
Теперь вот некоторые опечатки, которые он находит (точная опечатка оставлена как упражнение для читателя, чтобы подчеркнуть, насколько легко их можно упустить):
merge.js: (стабильная ссылка) (последняя редакция)
commands-packages-query.js: (стабильная ссылка) ( последняя редакция)
series-pie-tests.js: (стабильная ссылка) ( последняя редакция)
outline_case.js: (стабильная ссылка) (последняя редакция)
Вы можете увидеть некоторые инструменты для анализа статического кода JavaScript в этом Wiki.
Инструмент в Wiki, но не упомянутый в этом сообщении, DeepScan. Его внимание сосредоточено на поиске ошибок времени выполнения и проблем с качеством, а не на соглашениях об использовании линтеров. Он охватывает также TypeScript и React.
Вы можете попробовать его для своего проекта GitHub.
JSAnalyse только что опубликован на codeplex. Это инструмент, который анализирует зависимости между файлами javascript. Вы даже можете определить разрешенные зависимости, а JSAnalysis проверяет, выполнены ли определенные правила или нет. Это позволяет отслеживать зависимости javascript даже в больших проектах и иметь чистую архитектуру.
JSAnalyse может выполняться как инструмент командной строки или настраиваться с помощью диаграммы уровня Visual Studio. Он также легко интегрируется в сборку. С закрытыми регистрационными записями вы можете контролировать зависимостей.
Flow делает статический анализ с аннотациями и без них.
Если вам нужны аннотации, синтаксис совместим с TypeScript.
Установите package с помощью:
npm install --global flow-bin
Там также есть инструменты. Посмотрите gulp-flowtype и, возможно, SublimeLinter-flow
Наш SD ECMAScript CloneDR - это инструмент для поиска точных и близких копий дублированного кода на основе больших исходных кодов JavaScript.
Он использует синтаксис языка для управления обнаружением, поэтому он найдет клоны, несмотря на изменения формата, вставленные/удаленные комментарии, переименованные переменные и даже некоторые вставленные/удаленные операторы.
На сайте есть образец CloneDR, который запускается в Google Closure.
Полное раскрытие, я за этим: http://www.toptensoftware.com/minime, который выполняет минимизацию, обфускацию и разумный набор проверок стиля линта.