Я привык, что мой компилятор жалуется, когда я делаю что-то глупое, например опечатку в имени переменной, но в JavaScript есть привычка пропускать это.
Есть ли инструменты статического анализа для JavaScript?
Я привык, что мой компилятор жалуется, когда я делаю что-то глупое, например опечатку в имени переменной, но в JavaScript есть привычка пропускать это.
Есть ли инструменты статического анализа для JavaScript?
Ответы:
Я согласен, что JSLint - лучшее место для начала. Обратите внимание, что JavaScript Lint отличается от JSLint . Я также предлагаю проверить JSure , который в моем ограниченном тестировании показал себя лучше, чем любой из них, хотя и с некоторыми шероховатостями в реализации - версия Intel Mac вылетела при запуске для меня, хотя версия PowerPC работала нормально даже на Intel, и версия для Linux тоже работала нормально. (Разработчик, Берке Дурак, сказал, что свяжется со мной, когда это будет исправлено, но я не получил от него известий.)
Не ожидайте от статического анализа JavaScript столько, сколько от хорошего средства проверки C. Как сказал мне Дурак, «любой нетривиальный анализ очень труден из-за динамической природы Javascript».
(Еще одна, еще более непонятная ошибка только для Mac, на этот раз с виджетом JSLint Konfabulator: перетаскивание значка документа BBEdit на виджет перемещает документ в корзину. Разработчик, Дуглас Крокфорд, не пробовал использовать виджет на Mac.)
10 августа 2009 г .: Сегодня на Симпозиуме статического анализа Саймон Холм Йенсен представил доклад о TAJS: Type Analyzer для JavaScript , написанный с Андерсом Мёллером и Питером Тиманом. В документе не упоминаются вышеупомянутые инструменты, но Дженсен сказал мне, что смотрел на некоторые из них и не впечатлен. Код TAJS должен быть доступен этим летом.
ОБНОВЛЕННЫЙ ОТВЕТ, 2017: Да. Используйте ESLint. http://eslint.org
В дополнение к JSLint (уже упомянутому в ответе Flash Sheridan ) и компилятору Closure (ранее упомянутому в ответе awhyte ) я также получил много преимуществ от запуска JSHint и PHP CodeSniffer . По состоянию на 2012 год все четыре инструмента являются бесплатными с открытым исходным кодом и имеют большое и активное сообщество разработчиков. Каждый из них немного отличается (и, я думаю, дополняет друг друга) по видам проверок, которые они выполняют:
JSLint был разработан, и до сих пор остается личным инструментом линтинга Дугласа Крокфорда. Он поставляется с отличным набором правил по умолчанию - собственным набором правил Крокфорда, который постоянно обновляется, поскольку он продолжает изучать JavaScript и его подводные камни. JSLint очень самоуверен, и в целом это хорошо. Таким образом, существует (намеренно) ограниченное количество действий, которые вы можете сделать для настройки или отключения отдельных правил. Но это может затруднить применение JSLint к унаследованному коду.
JSHint очень похож на JSLint (на самом деле он начал свою жизнь как вилка JSLint), но проще / возможно настроить или отключить все проверки JSLint через параметры командной строки или через .jshintrc
файл .
Мне особенно нравится то, что я могу сказать JSHint сообщать обо всех ошибках в файле, даже если есть сотни ошибок. Напротив, хотя у JSLint есть maxerr
параметр конфигурации, он обычно выйдет из строя относительно рано при попытке обработать файлы, содержащие большое количество ошибок.
Закрытие компилятор является чрезвычайно полезным в том , что, если код не будет компилировать с закрытием, вы можете чувствовать себя очень уверены , указанный код является глубоко обливало какой - то коренным образом. Компиляция замыкания, возможно, самая близкая вещь, которая есть в мире JS, к проверке синтаксиса "интерпретатора" вроде php -l
илиruby -c
Closure также предупреждает вас о потенциальных проблемах, таких как отсутствующие параметры и необъявленные или переопределенные переменные. Если вы не видите ожидаемых предупреждений, попробуйте увеличить уровень предупреждения, вызвав Closure с опцией--warning_level VERBOSE
PHP CodeSniffer может анализировать JavaScript, а также PHP и CSS. CodeSniffer поставляется с несколькими различными стандартами кодирования (скажем, phpcs -i
для их просмотра), которые включают множество полезных сниффов для кода JavaScript, включая проверки на наличие встроенных структур управления и лишних пробелов .
Вот список сниффов JavaScript, доступных в PHP CodeSniffer, начиная с версии 1.3.6, и настраиваемый набор правил, который позволит вам запускать их все сразу. Используя настраиваемые наборы правил, легко выбрать правила, которые вы хотите применить. И вы даже можете написать свои собственные сниффы, если хотите применить особый «домашний стиль», который не поддерживается «из коробки». Afaik CodeSniffer - единственный инструмент из четырех упомянутых здесь, который поддерживает настройку и создание новых правил статического анализа. Однако одно предостережение: CodeSniffer также является самым медленным из всех упомянутых инструментов.
Компилятор Google "Closure" JS выдает настраиваемые предупреждения и ошибки во время компиляции. Он определенно находит переменные и методы с ошибками, а также ошибки арности. Если вы хотите написать JsDoc в стиле 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
Вы можете увидеть некоторые инструменты для статического анализа кода JavaScript в этой Wiki .
Инструмент в Wiki, но не упомянутый в этом посте, - это DeepScan . Его основное внимание уделяется поиску ошибок времени выполнения и проблем с качеством, а не соглашений о кодировании линтеров. Он также охватывает TypeScript, React и Vue.js.
Вы можете попробовать это в своем проекте GitHub.
Я попробовал ESlint и нашел его хорошим ... вы также можете добавить туда собственные правила ... Вот репозиторий github: https://github.com/nzakas/eslint, а вот введение в него: http: // www. nczonline.net/blog/2013/07/16/introduction-eslint/
Больше внимания уделяется безопасности, чем список общего назначения, можно найти в Mozilla Wiki в разделе Безопасность / B2G / Анализ кода JavaScript.
Цель этого документа - собрать инструменты анализа кода JavaScript, подходящие для включения в будущие проекты Mozilla или для внутреннего использования.
Также есть как минимум один коммерческий продукт, который выполняет анализ безопасности: Burp получает новые возможности анализа JavaScript.
Последний выпуск Burp включает новый движок для статического анализа кода JavaScript. Это позволяет Burp Scanner сообщать о ряде новых уязвимостей, в том числе:
- XSS на основе DOM
- Внедрение JavaScript
- Клиентская SQL-инъекция
- Взлом WebSocket
- Управление локальным путем к файлу
- Открытое перенаправление на основе DOM
- Манипуляции с файлами cookie
- Управление заголовком запроса Ajax
- Отказ в обслуживании на основе DOM
- Обработка веб-сообщений
- Управление хранилищем HTML5
В коммерческой сфере Coverity Static Analysis поддерживает анализ JavaScript начиная с версии 7.7 (середина 2015 г.). Что касается вашего конкретного запроса об опечатках, мой любимый проект, представленный в последней версии (8.0, начало 2016 г.), действительно обнаруживает опечатки в названиях элементов программы.
Как ключевой разработчик проекта, примите мою бессовестную мысль: хотя JavaScript-анализ Coverity еще не настолько зрел, как уважаемый анализ C / C ++ , он во многом похож на тот же механизм, с тем же акцентом на поиск важных дефектов с низким количество ложноположительных отчетов о дефектах. Мы уделяем больше внимания поиску дефектов безопасности в JavaScript (и других языках) в дополнение к поиску общих ошибок программирования.
Теперь вот несколько обнаруженных опечаток (точная опечатка оставлена в качестве упражнения для читателя, чтобы подчеркнуть, насколько легко их можно не заметить):
merge.js: (стабильная ссылка) (последняя версия)
commands-packages-query.js: (стабильная ссылка) (последняя версия)
series-pie-tests.js: (стабильная ссылка) (последняя версия)
Outline_case.js: (стабильная ссылка) (последняя версия)
Мне нравится Jslint за такие вещи ...
Flow выполняет статический анализ с аннотациями и без них.
Если вам нужны аннотации, синтаксис совместим с TypeScript .
Установите пакет с помощью:
npm install --global flow-bin
Также есть инструменты. Взгляните на gulp -flowtype и, возможно, на SublimeLinter-flow
JSAnalyse только что был опубликован на codeplex. Это инструмент, который анализирует зависимости между файлами javascript. Вы даже можете определить разрешенные зависимости, и JSAnalysis проверит, выполняются ли определенные правила или нет. Это позволяет отслеживать зависимости javascript даже в больших проектах и иметь чистую архитектуру.
JSAnalyse может быть запущен как инструмент командной строки или настроен с помощью Visual Studio Layer Diagramm. Также его легко интегрировать в сборку. С закрытой регистрацией вы можете держать зависимости под контролем.
Наш SD ECMAScript CloneDR - это инструмент для поиска точных и близких к промаху копий дублированного кода в больших базах исходного кода JavaScript.
Он использует синтаксис языка для управления обнаружением, поэтому он будет находить клоны, несмотря на изменения формата, вставленные / удаленные комментарии, переименованные переменные и даже некоторые вставленные / удаленные операторы.
На сайте есть образец CloneDR, запущенный в библиотеке Google Closure.
Полное раскрытие, я за этим: http://www.toptensoftware.com/minime, который выполняет минификацию, обфускацию и разумный набор проверок стиля lint.