Czy są jakieś narzędzia do analizy statycznej JavaScript? [Zamknięte]

110

Jestem przyzwyczajony do tego, że mój kompilator narzeka, kiedy robię coś głupiego, na przykład literówkę w nazwie zmiennej, ale JavaScript ma zwyczaj pozwalać na to.

Czy są jakieś narzędzia do analizy statycznej JavaScript?

Mata
źródło
1
teraz a dni maszynopis jest twoim przyjacielem - obsługuje niejawne sprawdzanie typu javascript, a jeśli chcesz przejść na 100%, możesz pisać adnotacje zamykające jsdoc3 lub Google, a stamtąd wywnioskuje typy. Redaktorzy tacy jak vscode lub webstorm obsługują go od razu po wyjęciu z pudełka: github.com/Microsoft/TypeScript/wiki/ ...
rakbero

Odpowiedzi:

49

Zgadzam się, że JSLint to najlepsze miejsce do rozpoczęcia. Należy pamiętać, że JavaScript Lint różni się od JSLint . Sugerowałbym również wypróbowanie JSure , która w moich ograniczonych testach wypadła lepiej niż którekolwiek z nich, chociaż z pewnymi nierównymi krawędziami implementacji - wersja Intel Mac uległa awarii podczas uruchamiania, chociaż wersja PowerPC działała dobrze nawet na Intelu, a wersja dla Linuxa również działała dobrze. (Deweloper, Berke Durak, powiedział, że skontaktuje się ze mną, kiedy to zostanie naprawione, ale nie miałem od niego wiadomości.)

Nie oczekuj od analizy statycznej JavaScript tyle, ile od dobrego narzędzia do sprawdzania języka C. Jak powiedział mi Durak, „każda nietrywialna analiza jest bardzo trudna ze względu na dynamiczną naturę JavaScript”.

(Kolejny, jeszcze bardziej niejasny błąd dotyczący tylko komputerów Mac, tym razem z widżetem Konfabulator JSLint: Przeciągnięcie ikony dokumentu BBEdit na widżet przenosi dokument do kosza. Deweloper, Douglas Crockford, nie wypróbował widżetu na komputerze Mac.)

10 sierpnia 2009: Dziś na sympozjum poświęconym analizie statycznej Simon Holm Jensen przedstawił artykuł na temat TAJS: Type Analyzer for JavaScript , napisany wspólnie z Andersem Møllerem i Peterem Thiemannem. Artykuł nie wspomina o powyższych narzędziach, ale Jensen powiedział mi, że przyjrzał się niektórym z nich i nie był pod wrażeniem. Kod do TAJS powinien być dostępny kiedyś tego lata.

Flash Sheridan
źródło
2
@UpTheCreek: JSLint jest dostępny na GitHub.
Dave Swersky
@Dave o racja, to świetnie :)
UpTheCreek
5
Kod źródłowy TAJS jest już dostępny.
Rich Dougherty
57

ZAKTUALIZOWANA ODPOWIEDŹ, 2017: Tak. Użyj ESLint. http://eslint.org


Oprócz JSLint (już wspomnianego w odpowiedzi Flash Sheridana ) i kompilatora Closure (wcześniej wspomnianego w odpowiedzi awhyte ), również wiele korzyści przyniosło mi uruchomienie JSHint i PHP CodeSniffer . Od 2012 roku wszystkie cztery narzędzia są darmowe i mają otwarte oprogramowanie, a za nimi stoi duża i aktywna społeczność programistów. Każdy z nich jest nieco inny (i myślę, że się uzupełniają) pod względem rodzajów kontroli, które wykonują:

JSLint został zaprojektowany jako osobiste narzędzie do szarpania Douglasa Crockforda . Jest dostarczany z doskonałym domyślnym zestawem reguł - własnym, Crockforda, stale aktualizowanym, gdy nadal poznaje JavaScript i jego pułapki. JSLint jest bardzo uparty i jest to ogólnie postrzegane jako dobra rzecz. W związku z tym istnieje (celowo) ograniczona ilość, którą możesz zrobić, aby skonfigurować lub wyłączyć poszczególne reguły. Ale może to utrudnić zastosowanie JSLint do starszego kodu.

JSHint jest bardzo podobny do JSLint (w rzeczywistości rozpoczął życie jako rozwidlenie JSLint), ale jest łatwiej / można skonfigurować lub wyłączyć wszystkie kontrole JSLint za pomocą opcji wiersza poleceń lub za pośrednictwem .jshintrcpliku .

Szczególnie podoba mi się to, że mogę powiedzieć JSHint, aby zgłosił wszystkie błędy w pliku, nawet jeśli są setki błędów. Z drugiej strony, chociaż JSLint ma maxerropcję konfiguracyjną, generalnie radzi sobie stosunkowo wcześnie podczas próby przetwarzania plików zawierających dużą liczbę błędów.

Kompilator Closure jest niezwykle przydatny, ponieważ jeśli kod nie skompiluje się z Closure, możesz mieć pewność, że ten kod jest głęboko zawężony w pewien fundamentalny sposób. Kompilacja zamykająca jest prawdopodobnie najbliższą rzeczą w świecie JS do sprawdzenia składni "interpretera", takiego jak php -llubruby -c

Zamknięcie ostrzega również o potencjalnych problemach, takich jak brakujące parametry i niezadeklarowane lub przedefiniowane zmienne. Jeśli nie widzisz ostrzeżeń, których się spodziewasz, spróbuj zwiększyć poziom ostrzeżenia, wywołując Closure z opcją--warning_level VERBOSE

PHP CodeSniffer może analizować JavaScript, a także PHP i CSS. CodeSniffer jest dostarczany z kilkoma różnymi standardami kodowania (powiedzmy, phpcs -iaby je zobaczyć), które obejmują wiele przydatnych funkcji wykrywania kodu JavaScript, w tym sprawdzanie wbudowanych struktur kontrolnych i zbędnych białych znaków .

Oto lista sniffów JavaScript dostępnych w PHP CodeSniffer od wersji 1.3.6, a tutaj jest niestandardowy zestaw reguł, który pozwoli Ci uruchomić je wszystkie naraz. Korzystając z niestandardowych zestawów reguł, łatwo jest wybrać i wybrać reguły, które chcesz zastosować. Możesz nawet napisać własne węszenie, jeśli chcesz narzucić określony „styl domowy”, który nie jest obsługiwany po wyjęciu z pudełka. Afaik CodeSniffer jest jedynym narzędziem spośród czterech wymienionych tutaj, które obsługuje dostosowywanie i tworzenie nowych reguł analizy statycznej. Jedno zastrzeżenie: CodeSniffer jest również najwolniejszym z wymienionych narzędzi.

Noah Sussman
źródło
2
Wykrywanie kopiuj-wklej dla kodu JavaScript jest teraz dostępne za pośrednictwem CPD. O ile mi wiadomo, jest to pierwsze solidne narzędzie do powielania kodu open source dla JavaScript! pmd.sourceforge.net i zobacz także pytanie „Czy istnieje narzędzie typu CPD dla javascript?” stackoverflow.com/a/13745190/55478
Noah Sussman,
20

Kompilator JS firmy Google „Closure” generuje konfigurowalne ostrzeżenia i błędy w czasie kompilacji. Na pewno znajduje błędne zmienne i metody, a także błędy liczbowe. Jeśli chcesz napisać JsDoc w sposób Closure, może to również zrobić wiele z informacjami o typie.

Narzędzie "Kompresor" YUI może również generować ostrzeżenia, ale jeszcze go nie wypróbowałem.

Nie miałem dużo szczęścia z Aptana IDE, zbudowanym na Eclipse, ale innym ludziom się to podoba. Zobacz omówienie przepełnienia stosu w środowiskach JS IDE.

IntelliJ IDE, które ostatnio nie było darmowe, ma świetną obsługę JS. Wykrywa i wyróżnia błędnie napisane zmienne i metody podczas pisania, i nie tylko. Ma też autouzupełnianie.

awhyte
źródło
11

Podsumowując, JSLint, JSHint, Plato, ESLint, Google Closure-Linter to dostępne narzędzia. Napotkałem problemy z instalacją podczas wypróbowywania Google Closure-Linter dla Windows. Ale wspomina na stronie internetowej, że jego obsługa systemu Windows jest eksperymentalna. Znalazłem i wypróbowałem inne narzędzie, które działa dobrze. Oto link do tego: http://esprima.org/

Jest to również link na github do narzędzia Esprima: https://github.com/ariya/esprima

użytkownik_19
źródło
7

Na tej Wiki można zobaczyć narzędzia do analizy statycznego kodu JavaScript .

Narzędziem na Wiki, o którym nie wspomniano w tym poście, jest DeepScan . Skupia się na wyszukiwaniu błędów w czasie wykonywania i problemów z jakością, a nie konwencji kodowania linters. Obejmuje również TypeScript, React i Vue.js.

Możesz to wypróbować w swoim projekcie GitHub.

Kangho Kim
źródło
4

Bardziej skoncentrowany na bezpieczeństwie niż lista ogólnego przeznaczenia można znaleźć na Mozilla Wiki pod adresem Security / B2G / JavaScript code analysis

Celem tego dokumentu jest zebranie narzędzi do analizy kodu JavaScript odpowiednich do włączenia do przyszłych projektów Mozilli lub do użytku wewnętrznego.

Istnieje również co najmniej jeden produkt komercyjny, który przeprowadza analizę bezpieczeństwa: Burp otrzymuje nowe możliwości analizy JavaScript

Najnowsza wersja Burp zawiera nowy silnik do statycznej analizy kodu JavaScript. Dzięki temu Burp Scanner może zgłosić szereg nowych luk w zabezpieczeniach, w tym:

  • XSS oparty na modelu DOM
  • Wstrzyknięcie JavaScript
  • Wstrzyknięcie SQL po stronie klienta
  • Przechwytywanie WebSocket
  • Manipulowanie lokalną ścieżką pliku
  • Otwarte przekierowanie oparte na DOM
  • Manipulacja plikami cookie
  • Manipulacja nagłówkiem żądania Ajax
  • Odmowa usługi oparta na modelu DOM
  • Manipulacja wiadomościami internetowymi
  • Manipulowanie pamięcią HTML5
Kevin Hakanson
źródło
4

W dziedzinie komercyjnej, Coverity Static Analysis obsługuje analizę JavaScript od wersji 7.7 (połowa 2015). Jeśli chodzi o twoje konkretne zapytanie dotyczące literówek, mój projekt dla zwierząt, który pojawił się w najnowszej wersji (8.0, początek 2016 r.) , Znajduje literówki w nazwach elementów programu.

Jako główny programista projektu, zaakceptuj moją bezwstydną wtyczkę: choć nie jest jeszcze tak dojrzała, jak czczona analiza C / C ++ Coverity JavaScript firmy Coverity ma wiele wspólnego z tym samym silnikiem, z takim samym naciskiem na znajdowanie defektów o dużej wartości z niską odsetek fałszywie pozytywnych zgłoszeń defektów. Coraz większy nacisk kładziemy na znajdowanie błędów bezpieczeństwa w JavaScript (i innych językach), a także na znajdowaniu ogólnych błędów programistycznych.

Teraz, oto kilka znalezionych literówek (dokładna literówka pozostawiona jako ćwiczenie dla czytelnika, aby podkreślić, jak łatwo można je przeoczyć):

merge.js: (stabilny link) (najnowsza wersja)

commands-packages-query.js: (stabilny link) (najnowsza wersja)

series-pie-tests.js: (stabilny link) (najnowsza wersja)

outline_case.js: (stabilny link) (najnowsza wersja)

Peter Dillinger
źródło
3

Lubię Jslint za tego typu rzeczy ...

Ismael
źródło
Chłodny. Znalazłem wtyczkę Eclipse dla JSLint na rockstarapps.com/joomla-1.5.8/products/ ... która też wygląda całkiem nieźle. Należy pamiętać, że aby uzyskać funkcjonalność JSLint, należy zainstalować z witryny „Eclipse Update dla wersji beta jsLex 1.2.2”.
Mat
3

Flow wykonuje analizę statyczną z adnotacjami i bez.

Jeśli potrzebujesz adnotacji, składnia jest zgodna z TypeScript .

Zainstaluj pakiet za pomocą:

npm install --global flow-bin

Jest też trochę narzędzi. Przyjrzyj się typowi gulp-flowtype i być może SublimeLinter-flow

Richard Ayotte
źródło
2

JSAnalyse zostało właśnie opublikowane w witrynie codeplex. Jest to narzędzie analizujące zależności między plikami javascript. Można nawet zdefiniować dozwolone zależności, a narzędzie JSAnalysis sprawdza, czy zdefiniowane reguły są spełnione, czy nie. Pozwala to na śledzenie zależności javascript nawet w dużych projektach i ma czystą architekturę.

JSAnalyse można uruchomić jako narzędzie wiersza poleceń lub skonfigurować za pomocą Visual Studio Layer Diagramm. Jest również łatwy do zintegrowania z kompilacją. Dzięki bramkowanym odprawom możesz zachować zależności pod kontrolą.

http://jsanalyse.codeplex.com/

tstune
źródło
1

Nasz SD ECMAScript CloneDR to narzędzie do znajdowania dokładnych i prawie zaginionych kopii duplikatów kodu w dużych bazach kodu źródłowego JavaScript.

Używa składni języka do kierowania wykrywaniem, więc znajdzie klony pomimo zmian formatu, wstawionych / usuniętych komentarzy, zmienionych nazw zmiennych, a nawet niektórych wstawionych / usuniętych instrukcji.

Witryna zawiera przykładowy CloneDR uruchomiony w bibliotece Google Closure.

Ira Baxter
źródło
czy ktoś już próbował tego? Nie znalazłem żadnego przycisku pobierania ani zamówienia ...
Sven Hecht
... Od stycznia 2011 ... jest link do pobrania, którego możesz użyć, aby zdobyć ewaluacyjną kopię CloneDR dla JavaScript (lub wielu innych języków) do zabawy.
Ira Baxter