Apakah ada alat analisis statis JavaScript? [Tutup]

110

Saya terbiasa memiliki kompiler saya mengeluh ketika saya melakukan sesuatu yang bodoh seperti salah ketik pada nama variabel tetapi JavaScript memiliki kebiasaan membiarkan ini berlalu.

Apakah ada alat analisis statis untuk JavaScript?

Tikar
sumber
1
sekarang skrip hari adalah teman Anda - ini mendukung pemeriksaan tipe implisit javascript dan jika Anda ingin 100% Anda dapat menulis jsdoc3 atau penjelasan penutupan google dan itu akan menyimpulkan jenis dari sana. Editor seperti vscode atau webstorm mendukungnya di luar kotak: github.com/Microsoft/TypeScript/wiki/…
cancerbero

Jawaban:

49

Saya setuju bahwa JSLint adalah tempat terbaik untuk memulai. Perhatikan bahwa JavaScript Lint berbeda dari JSLint . Saya juga menyarankan untuk memeriksa JSure , yang dalam pengujian terbatas saya melakukan lebih baik daripada keduanya, meskipun dengan beberapa sisi kasar dalam implementasinya — versi Intel Mac macet saat startup untuk saya, meskipun versi PowerPC berjalan dengan baik bahkan pada Intel, dan versi Linux juga berfungsi dengan baik. (Pengembang, Berke Durak, mengatakan dia akan menghubungi saya kembali ketika masalah ini diperbaiki, tetapi saya belum mendengar kabar darinya.)

Jangan berharap banyak dari analisis statis JavaScript seperti yang Anda dapatkan dari pemeriksa C yang baik. Seperti yang dikatakan Durak kepada saya, "analisis non-sepele apa pun sangat sulit karena sifat dinamis Javascript".

(Bug lain yang bahkan lebih tidak jelas untuk Mac, kali ini dengan widget Konfabulator JSLint: Menarik ikon dokumen BBEdit ke widget akan memindahkan dokumen ke sampah. Pengembang, Douglas Crockford, belum mencoba widget di Mac.)

10 Agustus 2009: Hari ini di Simposium Analisis Statis , Simon Holm Jensen mempresentasikan makalah tentang TAJS: Type Analyzer untuk JavaScript , yang ditulis bersama Anders Møller dan Peter Thiemann. Makalah tidak menyebutkan alat-alat di atas, tetapi Jensen mengatakan kepada saya bahwa dia telah melihat beberapa di antaranya dan tidak terkesan. Kode untuk TAJS akan tersedia sekitar musim panas ini.

Flash Sheridan
sumber
2
@UpTheCreek: JSLint tersedia di GitHub.
Dave Swersky
@Dave oh benar, itu hebat :)
UpTheCreek
5
Kode sumber untuk TAJS sekarang tersedia.
Rich Dougherty
57

JAWABAN DIPERBARUI, 2017: Ya. Gunakan ESLint. http://eslint.org


Selain JSLint (sudah disebutkan dalam jawaban Flash Sheridan ) dan kompiler Penutupan (sebelumnya disebutkan dalam jawaban awhyte ) saya juga mendapatkan banyak manfaat dari menjalankan JSHint dan PHP CodeSniffer . Pada 2012, keempat alat adalah sumber terbuka gratis dan memiliki komunitas pengembang yang besar dan aktif di belakangnya. Mereka masing-masing sedikit berbeda (dan menurut saya, saling melengkapi) dalam jenis pemeriksaan yang mereka lakukan:

JSLint dirancang untuk menjadi, dan masih merupakan alat linting pribadi Douglas Crockford. Ini dikirimkan dengan seperangkat aturan default yang bagus - milik Crockford, terus diperbarui saat ia terus belajar tentang JavaScript dan perangkapnya. JSLint sangat beropini dan ini umumnya dipandang sebagai hal yang baik. Jadi, ada (dengan sengaja) jumlah terbatas yang dapat Anda lakukan untuk mengonfigurasi atau menonaktifkan aturan individual. Tapi ini bisa mempersulit penerapan JSLint ke kode lama.

JSHint sangat mirip dengan JSLint (sebenarnya ini dimulai sebagai garpu JSLint) tetapi lebih mudah / mungkin untuk mengkonfigurasi atau menonaktifkan semua pemeriksaan JSLint melalui opsi baris perintah atau melalui .jshintrcfile .

Saya sangat suka bahwa saya dapat memberi tahu JSHint untuk melaporkan semua kesalahan dalam sebuah file, bahkan jika ada ratusan kesalahan. Sebaliknya, meskipun JSLint memiliki maxerropsi konfigurasi , JSLint umumnya akan ditalangi relatif lebih awal saat mencoba memproses file yang berisi banyak kesalahan.

Compiler Closure sangat berguna karena, jika kode tidak dapat dikompilasi dengan Closure, Anda dapat merasa sangat yakin kode tersebut disemprotkan dalam beberapa cara mendasar. Kompilasi penutupan mungkin adalah hal terdekat yang ada di dunia JS dengan pemeriksaan sintaks "interpreter" seperti php -latauruby -c

Penutupan juga memperingatkan Anda tentang potensi masalah seperti parameter yang hilang dan variabel yang tidak dideklarasikan atau didefinisikan ulang. Jika Anda tidak melihat peringatan yang Anda harapkan, coba tingkatkan level peringatan dengan mengaktifkan Closure dengan opsi--warning_level VERBOSE

PHP CodeSniffer dapat mengurai JavaScript serta PHP dan CSS. CodeSniffer dikirimkan dengan beberapa standar pengkodean yang berbeda, (katakanlah phpcs -iuntuk melihatnya) yang mencakup banyak sniff yang berguna untuk kode JavaScript termasuk pemeriksaan terhadap struktur kontrol inline dan spasi kosong yang berlebihan .

Berikut adalah daftar sniff JavaScript yang tersedia di PHP CodeSniffer mulai versi 1.3.6 dan berikut adalah seperangkat aturan khusus yang memungkinkan Anda menjalankan semuanya sekaligus. Dengan menggunakan kumpulan aturan kustom, Anda dapat dengan mudah memilih dan memilih aturan yang ingin Anda terapkan. Dan Anda bahkan dapat menulis sniff Anda sendiri jika Anda ingin menerapkan "gaya rumah" tertentu yang tidak didukung di luar kotak. Afaik CodeSniffer adalah satu-satunya alat dari empat alat yang disebutkan di sini yang mendukung penyesuaian dan pembuatan aturan analisis statis baru. Satu peringatan: CodeSniffer juga berjalan paling lambat dari semua alat yang disebutkan.

Noah Sussman
sumber
2
Deteksi salin-tempel untuk kode JavaScript sekarang tersedia melalui CPD. Sepengetahuan saya, ini adalah alat duplikasi kode sumber terbuka yang kuat untuk JavaScript! pmd.sourceforge.net dan lihat juga pertanyaan "Apakah ada alat bantu seperti CPD untuk javascript?" stackoverflow.com/a/13745190/55478
Noah Sussman
20

Kompiler JS "Penutupan" Google menghasilkan peringatan dan kesalahan yang dapat dikonfigurasi pada waktu kompilasi. Ini pasti menemukan variabel dan metode yang salah eja, ditambah kesalahan arity. Jika Anda ingin menulis JsDoc dengan cara Penutupan, ia dapat melakukan banyak hal dengan informasi jenis juga.

Alat "Kompresor" YUI dapat menghasilkan peringatan juga, tetapi belum mencobanya.

Saya belum terlalu beruntung dengan Aptana IDE, yang dibangun di atas Eclipse, tetapi orang lain menyukainya. Lihat diskusi Stack Overflow tentang JS IDE.

IntelliJ IDE, yang tidak gratis terakhir kali saya periksa, memiliki dukungan JS yang sangat baik. Ini akan mendeteksi dan menyorot vars dan metode yang salah eja saat Anda mengetik, dan banyak lagi. Itu juga dilengkapi pelengkapan otomatis.

awhyte
sumber
11

Singkatnya, JSLint, JSHint, Plato, ESLint, Google Closure-Linter adalah alat yang tersedia. Saya menghadapi masalah penginstalan saat mencoba Google Closure-Linter untuk Windows. Tapi, ia menyebutkan di halaman web bahwa dukungannya untuk Windows bersifat eksperimental. Saya menemukan dan mencoba alat lain yang bekerja dengan baik. Ini tautannya: http://esprima.org/

Juga, ini adalah tautan github untuk alat tersebut Esprima: https://github.com/ariya/esprima

pengguna_19
sumber
7

Anda dapat melihat beberapa alat untuk analisis kode statis JavaScript di Wiki ini .

Alat di Wiki, tetapi tidak disebutkan dalam posting ini, adalah DeepScan . Fokusnya adalah menemukan kesalahan runtime dan masalah kualitas daripada konvensi pengkodean linter. Ini mencakup juga TypeScript, React dan Vue.js.

Anda dapat mencobanya untuk proyek GitHub Anda.

Kangho Kim
sumber
4

Keamanan yang lebih terfokus daripada daftar tujuan umum dapat ditemukan di Mozilla Wiki di analisis kode Keamanan / B2G / JavaScript

Tujuan dari dokumen ini adalah untuk mengumpulkan alat analisis kode JavaScript yang sesuai untuk disertakan dalam proyek Mozilla yang akan datang atau untuk penggunaan internal.

Juga setidaknya ada satu produk komersial yang melakukan analisis keamanan: Burp mendapatkan kemampuan analisis JavaScript baru

Rilis terbaru Burp menyertakan mesin baru untuk analisis statis kode JavaScript. Ini memungkinkan Pemindai Burp melaporkan berbagai kerentanan baru, termasuk:

  • XSS berbasis DOM
  • Injeksi JavaScript
  • Injeksi SQL sisi klien
  • Pembajakan WebSocket
  • Manipulasi jalur file lokal
  • Pengalihan terbuka berbasis DOM
  • Manipulasi cookie
  • Manipulasi header permintaan Ajax
  • Penolakan layanan berbasis DOM
  • Manipulasi pesan web
  • Manipulasi penyimpanan HTML5
Kevin Hakanson
sumber
4

Di ranah komersial, Coverity Static Analysis mendukung analisis JavaScript mulai versi 7.7 (pertengahan 2015). Mengenai pertanyaan spesifik Anda tentang kesalahan ketik, proyek hewan peliharaan saya yang muncul di rilis terbaru (8.0, awal 2016) menemukan kesalahan ketik pada nama elemen program.

Sebagai pengembang utama dalam proyek ini, terimalah steker saya yang tidak tahu malu: Meskipun belum setua analisis C / C ++ yang dihormati , analisis JavaScript Coverity berbagi banyak mesin yang sama, dengan fokus yang sama untuk menemukan cacat bernilai tinggi dengan yang rendah tingkat laporan cacat positif palsu. Kami meningkatkan fokus kami untuk menemukan kerusakan keamanan di JavaScript (dan bahasa lain), selain menemukan kesalahan pemrograman umum.

Sekarang, berikut adalah beberapa kesalahan ketik yang ditemukannya (kesalahan ketik persis tersisa sebagai latihan bagi pembaca, untuk menekankan betapa mudahnya hal ini dapat diabaikan):

merge.js: (stable link) (revisi terbaru)

commands-packages-query.js: (stable link) (revisi terbaru)

series-pie-tests.js: (stable link) (revisi terbaru)

outline_case.js: (stable link) (revisi terbaru)

Peter Dillinger
sumber
3

Saya suka Jslint untuk hal semacam ini ...

Ismail
sumber
Keren. Saya menemukan plugin Eclipse untuk JSLint di rockstarapps.com/joomla-1.5.8/products/… yang terlihat cukup bagus juga. Perhatikan bahwa seseorang perlu menginstal dari 'situs Pembaruan Eclipse untuk Versi Beta jsLex 1.2.2' untuk mendapatkan fungsionalitas JSLint.
Mat
3

Flow melakukan analisis statis dengan dan tanpa anotasi.

Jika Anda memerlukan anotasi, sintaksnya kompatibel dengan TypeScript .

Instal paket dengan:

npm install --global flow-bin

Ada juga beberapa perkakas. Lihat jenis aliran gulp dan mungkin aliran SublimeLinter

Richard Ayotte
sumber
2

JSAnalyse baru saja diterbitkan di codeplex. Ini adalah alat yang menganalisis ketergantungan antara file javascript. Anda bahkan dapat menentukan dependensi yang diizinkan dan JSAnalysis memeriksa apakah aturan yang ditentukan terpenuhi atau tidak. Itu memungkinkan untuk melacak tentang dependensi javascript bahkan dalam proyek besar dan memiliki arsitektur yang bersih.

JSAnalyse dapat dijalankan sebagai alat baris perintah atau dikonfigurasi melalui Visual Studio Layer Diagramm. Ini juga mudah diintegrasikan ke dalam build. Dengan gated check-in, Anda dapat mengontrol dependensi.

http://jsanalyse.codeplex.com/

tstune
sumber
1

Kami SD ECMAScript CloneDR adalah alat untuk menemukan yang tepat dan salinan dekat-miss kode digandakan di seluruh JavaScript basis kode sumber besar.

Ini menggunakan sintaks bahasa untuk memandu pendeteksian, sehingga akan menemukan klon meskipun ada perubahan format, komentar yang disisipkan / dihapus, variabel yang diganti namanya dan bahkan beberapa pernyataan yang disisipkan / dihapus.

Situs ini memiliki contoh CloneDR yang dijalankan di pustaka Penutupan Google.

Ira Baxter
sumber
apakah ada yang sudah mencoba yang ini? Tidak menemukan tombol unduh atau pesan ...
Sven Hecht
... Sejak Januari 2011 ... ada tautan unduhan yang dapat Anda gunakan untuk mendapatkan salinan evaluasi CloneDR untuk JavaScript (atau sejumlah bahasa lain) untuk dimainkan.
Ira Baxter