Есть ли инструменты статического анализа 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


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».
Мат,


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 (или ряда других языков), чтобы поиграть.
Ира Бакстер

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.