Я звик, щоб мій компілятор скаржився, коли я роблю щось таке дурне, як помилка друку на змінному імені, але JavaScript має звичку пропускати це.
Чи є інструменти статичного аналізу для JavaScript?
Я звик, щоб мій компілятор скаржився, коли я роблю щось таке дурне, як помилка друку на змінному імені, але JavaScript має звичку пропускати це.
Чи є інструменти статичного аналізу для JavaScript?
Відповіді:
Я згоден, що 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 повинен бути доступний десь цього літа.
ОНОВЛЕНО ВІДПОВІДЬ, 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 - це також найбільш повільне виконання будь-якого із згаданих інструментів.
Компілятор JS від Google "Закриття" створює настроювані попередження та помилки під час компіляції. Це безумовно знаходить неправильно написані змінні та методи, плюс помилки arity. Якщо ви готові написати JsDoc способом закриття, це може багато зробити і з інформацією про тип.
Інструмент 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 ви можете побачити в цій Вікі .
DeepScan - це інструмент у Вікі, але не згадується у цій публікації . Його фокус - пошук помилок виконання та питань якості, а не кодування умовних ліній. Він охоплює також TypeScript, React та Vue.js.
Ви можете спробувати це для свого проекту GitHub.
Я спробував ESlint і знайшов його good..you також можна додати користувацькі правила there..Here є GitHub репо: https://github.com/nzakas/eslint і тут є введення в нього: HTTP: // WWW. nczonline.net/blog/2013/07/16/introducing-eslint/
Більш сфокусований на безпеці, ніж список загального призначення, можна знайти в Mozilla Wiki за адресою Аналіз безпеки / B2G / JavaScript
Метою цього документа є збір інструментів аналізу коду JavaScript, придатних для включення в майбутні проекти Mozilla або для внутрішнього використання.
Також є щонайменше один комерційний продукт, що робить аналіз безпеки: Берп отримує нові можливості аналізу JavaScript
Остання версія Burp включає в себе новий двигун для статичного аналізу коду JavaScript. Це дозволяє сканеру Burp повідомляти про цілий ряд нових уразливостей, включаючи:
- XSS на основі DOM
- Введення JavaScript
- Клієнтська ін'єкція SQL
- Викрадення WebSocket
- Маніпулювання локальним файлом
- Відкрите перенаправлення на основі DOM
- Маніпулювання печивом
- Маніпулювання заголовком запиту Ajax
- Відмова в послузі на основі DOM
- Маніпуляція веб-повідомленнями
- Маніпуляція зі зберіганням HTML5
У комерційній царині статистичний аналіз покриття підтримує аналіз JavaScript станом на версію 7.7 (середина 2015 року). Що стосується конкретного запиту щодо помилок друку, проект мого домашнього улюбленця, який з’являється в останньому випуску (8.0, початок 2016 року), виявляє помилки друку в назвах програмних елементів.
Як ключовий розробник проекту, прийміть мій безсоромний штекер: Хоча він ще не такий зрілий, як шановний аналіз C / C ++, аналіз JavaScript Coverity має багато того самого двигуна, з таким же фокусом на пошуку високоцінних дефектів з низьким кількість помилкових позитивних повідомлень про дефекти. Ми все більше акцентуємо увагу на пошуку дефектів безпеки в JavaScript (та інших мовах), а також на пошуку загальних помилок програмування.
Тепер ось кілька помилок, які він знаходить (точні друкарські помилки залишаються як вправа для читача, щоб підкреслити, як легко їх можна не помітити):
merge.js: (стабільне посилання) (остання редакція)
Команди-пакети-query.js: (стабільне посилання) (остання редакція)
series-pie-testing.js: (стабільне посилання) (остання редакція)
outline_case.js: (стабільне посилання) (остання редакція)
Мені подобається Jslint за такі речі ...
Потік робить статичний аналіз із примітками та без них.
Якщо вам потрібні примітки, синтаксис сумісний із TypeScript .
Встановіть пакет за допомогою:
npm install --global flow-bin
Є також деякі інструменти. Погляньте на тип gulp-flow та, можливо, SublimeLinter-flow
Щойно опубліковано JSAnalyse на кодоплексі. Це інструмент, який аналізує залежності між файлами javascript. Ви навіть можете визначити дозволені залежності і JSAnalysis перевіряє, чи виконані визначені правила чи ні. Це дозволяє відслідковувати залежності javascript навіть у великих проектах та мати чисту архітектуру.
JSAnalyse може бути виконаний як інструмент командного рядка або налаштований за допомогою Visual Studio Layer Diagramm. Це також легко інтегруватися в збірку. За допомогою закритих реєстрацій ви можете тримати залежності під контролем.
Наш SD ECMAScript CloneDR - це інструмент для пошуку точних та майже пропущених копій дубльованого коду у великих базах вихідних кодів JavaScript.
Він використовує синтаксис мови для керування виявленням, тому він знайде клони, незважаючи на зміни формату, вставлені / видалені коментарі, перейменовані змінні та навіть деякі вставлені / видалені заяви.
На сайті є зразок CloneDR, який працює в бібліотеці закриття Google.
Повне розкриття, я стою за цим: http://www.toptensoftware.com/minime, що робить мінімізацію, затуманення та розумний набір перевірок стилю ворсинок.