Есть ли инструменты статического анализа JavaScript? [закрыто]

111

Я привык, что мой компилятор жалуется, когда я делаю что-то глупое, например опечатку в имени переменной, но в JavaScript есть привычка пропускать это.

Есть ли инструменты статического анализа для JavaScript?

Мат
источник
1
Теперь ваш друг - days typescript - он поддерживает неявную проверку типов javascript, и если вы хотите перейти на 100%, вы можете написать аннотации закрытия jsdoc3 или google, и он будет выводить типы оттуда. Редакторы, такие как vscode или webstorm, поддерживают его из коробки: github.com/Microsoft/TypeScript/wiki/…
Cancebero

Ответы:

49

Я согласен, что 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 должен быть доступен этим летом.

Флэш Шеридан
источник
2
@UpTheCreek: JSLint доступен на GitHub.
Дэйв Сверски,
@ Дэйв, да ладно, это здорово :)
UpTheCreek
5
Исходный код TAJS теперь доступен.
Rich Dougherty,
57

ОБНОВЛЕННЫЙ ОТВЕТ, 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 также является самым медленным из всех упомянутых инструментов.

Ной Сассман
источник
2
Обнаружение копирования-вставки для кода JavaScript теперь доступно через CPD. Насколько мне известно, это первый надежный инструмент для дублирования кода с открытым исходным кодом для JavaScript! pmd.sourceforge.net и посмотрите также вопрос "Есть ли инструмент, подобный CPD для javascript?" stackoverflow.com/a/13745190/55478
Ной Суссман
20

Компилятор Google "Closure" JS выдает настраиваемые предупреждения и ошибки во время компиляции. Он определенно находит переменные и методы с ошибками, а также ошибки арности. Если вы хотите написать JsDoc в стиле Closure, он также может многое сделать с информацией о типе.

Инструмент YUI «Компрессор» тоже может выдавать предупреждения, но еще не пробовал.

Мне не очень повезло с Aptana IDE, построенной на Eclipse, но другим она нравится. См. Обсуждение JS IDE при переполнении стека.

IntelliJ IDE, которая не является бесплатной в прошлый раз, имеет чертовски отличную поддержку JS. Он будет обнаруживать и выделять ошибочно написанные переменные и методы по мере ввода и т. Д. У него тоже есть автозаполнение.

айт
источник
11

Таким образом, JSLint, JSHint, Plato, ESLint, Google Closure-Linter - это доступные инструменты. У меня возникли проблемы с установкой, когда я пробовал использовать Google Closure-Linter для Windows. Но на веб-странице упоминается, что поддержка Windows является экспериментальной. Я нашел и попробовал другой инструмент, который работает хорошо. Вот ссылка на него: http://esprima.org/

Кроме того, это ссылка на github для инструмента Esprima: https://github.com/ariya/esprima

user_19
источник
7

Вы можете увидеть некоторые инструменты для статического анализа кода JavaScript в этой Wiki .

Инструмент в Wiki, но не упомянутый в этом посте, - это DeepScan . Его основное внимание уделяется поиску ошибок времени выполнения и проблем с качеством, а не соглашений о кодировании линтеров. Он также охватывает TypeScript, React и Vue.js.

Вы можете попробовать это в своем проекте GitHub.

Канго Ким
источник
4

Больше внимания уделяется безопасности, чем список общего назначения, можно найти в Mozilla Wiki в разделе Безопасность / B2G / Анализ кода JavaScript.

Цель этого документа - собрать инструменты анализа кода JavaScript, подходящие для включения в будущие проекты Mozilla или для внутреннего использования.

Также есть как минимум один коммерческий продукт, который выполняет анализ безопасности: Burp получает новые возможности анализа JavaScript.

Последний выпуск Burp включает новый движок для статического анализа кода JavaScript. Это позволяет Burp Scanner сообщать о ряде новых уязвимостей, в том числе:

  • XSS на основе DOM
  • Внедрение JavaScript
  • Клиентская SQL-инъекция
  • Взлом WebSocket
  • Управление локальным путем к файлу
  • Открытое перенаправление на основе DOM
  • Манипуляции с файлами cookie
  • Управление заголовком запроса Ajax
  • Отказ в обслуживании на основе DOM
  • Обработка веб-сообщений
  • Управление хранилищем HTML5
Кевин Хакансон
источник
4

В коммерческой сфере 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: (стабильная ссылка) (последняя версия)

Питер Диллинджер
источник
3

Мне нравится Jslint за такие вещи ...

Ишмаэль
источник
Прохладно. Я нашел плагин Eclipse для JSLint по адресу rockstarapps.com/joomla-1.5.8/products/… который тоже выглядит неплохо. Обратите внимание, что для получения функциональности JSLint необходимо выполнить установку с «сайта обновлений Eclipse для бета-версии jsLex 1.2.2».
Мат,
3

Flow выполняет статический анализ с аннотациями и без них.

Если вам нужны аннотации, синтаксис совместим с TypeScript .

Установите пакет с помощью:

npm install --global flow-bin

Также есть инструменты. Взгляните на gulp -flowtype и, возможно, на SublimeLinter-flow

Ричард Айотт
источник
2

JSAnalyse только что был опубликован на codeplex. Это инструмент, который анализирует зависимости между файлами javascript. Вы даже можете определить разрешенные зависимости, и JSAnalysis проверит, выполняются ли определенные правила или нет. Это позволяет отслеживать зависимости javascript даже в больших проектах и ​​иметь чистую архитектуру.

JSAnalyse может быть запущен как инструмент командной строки или настроен с помощью Visual Studio Layer Diagramm. Также его легко интегрировать в сборку. С закрытой регистрацией вы можете держать зависимости под контролем.

http://jsanalyse.codeplex.com/

настройка
источник
1

Наш SD ECMAScript CloneDR - это инструмент для поиска точных и близких к промаху копий дублированного кода в больших базах исходного кода JavaScript.

Он использует синтаксис языка для управления обнаружением, поэтому он будет находить клоны, несмотря на изменения формата, вставленные / удаленные комментарии, переименованные переменные и даже некоторые вставленные / удаленные операторы.

На сайте есть образец CloneDR, запущенный в библиотеке Google Closure.

Ира Бакстер
источник
кто-нибудь пробовал это еще? Не нашел ни одной кнопки загрузки или заказа ...
Sven Hecht
... С января 2011 ... есть ссылка для скачивания, которую вы можете использовать, чтобы получить пробную копию CloneDR для JavaScript (или ряда других языков), чтобы поиграть.
Ира Бакстер
0

Полное раскрытие, я за этим: http://www.toptensoftware.com/minime, который выполняет минификацию, обфускацию и разумный набор проверок стиля lint.

Брэд Робинсон
источник