Чи є інструменти статичного аналізу JavaScript? [зачинено]


110

Я звик, щоб мій компілятор скаржився, коли я роблю щось таке дурне, як помилка друку на змінному імені, але JavaScript має звичку пропускати це.

Чи є інструменти статичного аналізу для JavaScript?


1
тепер typecript є вашим другом - він підтримує неявну перевірку типу 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, цього разу з віджетом Konfabulator JSLint: Перетягування значка документа BBEdit на віджет переміщує документ у кошик. Розробник, Дуглас Крокфорд, не спробував віджет на Mac.)

10 серпня 2009 року: Сьогодні на симпозіумі статистичного аналізу Саймон Холм Дженсен представив документ про TAJS: Type Analyzer для JavaScript , написаний з Андерсом Мёллером та Пітером Тіманом. У статті не згадуються вищезазначені інструменти, але Дженсен сказав мені, що переглянув деякі з них і не був вражений. Код для TAJS повинен бути доступний десь цього літа.


2
@UpTheCreek: JSLint доступний на GitHub.
Дейв Сверський

@Dave oh right, це чудово :)
UpTheCreek

5
Вихідний код для TAJS тепер доступний.
Rich Dougherty

57

ОНОВЛЕНО ВІДПОВІДЬ, 2017: Так. Використовуйте ESLint. http://eslint.org


На додаток до JSLint (вже згадується у відповіді Flash Sheridan ) та компілятора закриття (раніше згадуваного у відповіді awhyte ), я також отримав багато користі від запуску JSHint та PHP CodeSniffer . Станом на 2012 рік усі чотири інструменти є безкоштовним відкритим кодом та мають велике та активне співтовариство розробників. Кожен з них дещо відрізняється (і, на мою думку, доповнює) у різних видах перевірок:

JSLint був розроблений таким, щоб він був і досі є особистим інструментом для підшивки Дугласа Крокфорда. Він постачається з великим набором правил за замовчуванням - власним Крокфордом, що постійно оновлюється, оскільки він продовжує дізнаватися про JavaScript та його підводні камені. JSLint дуже впевнений, і це, як правило, сприймається як хороша річ. Таким чином, є (навмисно) обмежена кількість, яку ви можете зробити для налаштування або відключення окремих правил. Але це може ускладнити застосування JSLint до застарілого коду.

JSHint дуже схожий на JSLint (адже він почав життя як вилка JSLint), але простіше / можливо налаштувати або відключити всі перевірки JSLint за допомогою параметрів командного рядка або через .jshintrcфайл .

Мені особливо подобається, що я можу сказати JSHint повідомляти про всі помилки у файлі, навіть якщо є сотні помилок. На противагу цьому, хоча JSLint має maxerrваріант конфігурації, він, як правило, виправляється відносно рано при спробі обробки файлів, що містять велику кількість помилок.

Компілятор закриття надзвичайно корисний тим, що, якщо код не буде компілюватися із закриттям, ви можете відчути, що зазначений код є глибоко введеним в якийсь фундаментальний спосіб. Компіляція закриття - це, можливо, найближче, що є у світі JS, до перевірки синтаксису "інтерпретатора", наприклад, php -lабоruby -c

Закриття також попереджає про можливі проблеми, такі як відсутні параметри та недекларовані або переосмислені змінні. Якщо ви не бачите очікуваних попереджень, спробуйте підвищити рівень попередження, застосувавши Закриття за допомогою параметра--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

Компілятор JS від Google "Закриття" створює настроювані попередження та помилки під час компіляції. Це безумовно знаходить неправильно написані змінні та методи, плюс помилки arity. Якщо ви готові написати JsDoc способом закриття, це може багато зробити і з інформацією про тип.

Інструмент 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 ви можете побачити в цій Вікі .

DeepScan - це інструмент у Вікі, але не згадується у цій публікації . Його фокус - пошук помилок виконання та питань якості, а не кодування умовних ліній. Він охоплює також TypeScript, React та Vue.js.

Ви можете спробувати це для свого проекту GitHub.



4

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

Метою цього документа є збір інструментів аналізу коду JavaScript, придатних для включення в майбутні проекти Mozilla або для внутрішнього використання.

Також є щонайменше один комерційний продукт, що робить аналіз безпеки: Берп отримує нові можливості аналізу JavaScript

Остання версія Burp включає в себе новий двигун для статичного аналізу коду JavaScript. Це дозволяє сканеру Burp повідомляти про цілий ряд нових уразливостей, включаючи:

  • XSS на основі DOM
  • Введення JavaScript
  • Клієнтська ін'єкція SQL
  • Викрадення WebSocket
  • Маніпулювання локальним файлом
  • Відкрите перенаправлення на основі DOM
  • Маніпулювання печивом
  • Маніпулювання заголовком запиту Ajax
  • Відмова в послузі на основі DOM
  • Маніпуляція веб-повідомленнями
  • Маніпуляція зі зберіганням HTML5

4

У комерційній царині статистичний аналіз покриття підтримує аналіз JavaScript станом на версію 7.7 (середина 2015 року). Що стосується конкретного запиту щодо помилок друку, проект мого домашнього улюбленця, який з’являється в останньому випуску (8.0, початок 2016 року), виявляє помилки друку в назвах програмних елементів.

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

Тепер ось кілька помилок, які він знаходить (точні друкарські помилки залишаються як вправа для читача, щоб підкреслити, як легко їх можна не помітити):

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

Команди-пакети-query.js: (стабільне посилання) (остання редакція)

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

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


3

Мені подобається Jslint за такі речі ...


Класно. Я знайшов плагін Eclipse для JSLint на rockstarapps.com/joomla-1.5.8/products/…, який теж виглядає непогано. Зверніть увагу, що для отримання функціональності JSLint потрібно встановити з веб-сайту "Eclipse Update для бета-версії jsLex 1.2.2".
Мат


2

Щойно опубліковано JSAnalyse на кодоплексі. Це інструмент, який аналізує залежності між файлами javascript. Ви навіть можете визначити дозволені залежності і JSAnalysis перевіряє, чи виконані визначені правила чи ні. Це дозволяє відслідковувати залежності javascript навіть у великих проектах та мати чисту архітектуру.

JSAnalyse може бути виконаний як інструмент командного рядка або налаштований за допомогою Visual Studio Layer Diagramm. Це також легко інтегруватися в збірку. За допомогою закритих реєстрацій ви можете тримати залежності під контролем.

http://jsanalyse.codeplex.com/


1

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

Він використовує синтаксис мови для керування виявленням, тому він знайде клони, незважаючи на зміни формату, вставлені / видалені коментарі, перейменовані змінні та навіть деякі вставлені / видалені заяви.

На сайті є зразок CloneDR, який працює в бібліотеці закриття Google.


хтось ще пробував цього? Не знайшли жодних кнопок для завантаження чи замовлення ...
Sven Hecht

... З січня 2011 року ... є посилання для завантаження, за допомогою якого ви можете отримати еквівалентну копію CloneDR для JavaScript (або ряд інших мов), з якою можна грати.
Іра Бакстер

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.