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

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

Существуют ли какие-либо инструменты статического анализа для JavaScript?

Ответ 1

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

Ответ 2

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

Ответ 3

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

Инструмент "Компрессор" YUI также может создавать предупреждения, но еще не пробовал его.

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

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

Ответ 4

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

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

Ответ 6

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

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

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

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

  • XSS на основе DOM
  • JavaScript-инъекция
  • SQL-инъекция на стороне клиента
  • Улавливание WebSocket
  • Локальный путь к файлу
  • Открытое перенаправление на основе DOM
  • Использование файлов cookie
  • Обработка заголовка запроса Ajax
  • Отказ от обслуживания на основе DOM
  • Обработка веб-сообщений.
  • Обработка содержимого HTML5

Ответ 7

Мне нравится Jslint для такого рода вещей...

Ответ 8

В коммерческой сфере Статический анализ покрытия поддерживает анализ JavaScript с версии 7.7 (в середине 2015 года), Что касается вашего конкретного запроса о опечатках, мой любимый проект, появляющийся в последней версии (8.0, начало 2016 года) , находит опечатки в именах программных элементов.

Как ключевой разработчик проекта, примите мой бесстыдный плагин: хотя он еще не созрел, как почитаемый анализ C/С++, Coverity Анализ JavaScript разделяет большую часть одного и того же движка, с тем же фокусом на поиск высокоценных дефектов с низкой скоростью ложных положительных отчетов о дефектах. Мы уделяем больше внимания обнаружению дефектов безопасности в JavaScript (и других языках) в дополнение к поиску общих ошибок программирования.

Теперь вот некоторые опечатки, которые он находит (точная опечатка оставлена ​​как упражнение для читателя, чтобы подчеркнуть, насколько легко их можно упустить):

merge.js: (стабильная ссылка) (последняя редакция)

commands-packages-query.js: (стабильная ссылка) ( последняя редакция)

series-pie-tests.js: (стабильная ссылка) ( последняя редакция)

outline_case.js: (стабильная ссылка) (последняя редакция)

Ответ 9

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

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

Вы можете попробовать его для своего проекта GitHub.

Ответ 10

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

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

http://jsanalyse.codeplex.com/

Ответ 11

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

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

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

npm install --global flow-bin

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

Ответ 12

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

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

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

Ответ 13

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