Bagaimana cara melakukan analisis kode statis di php? [Tutup]

466

Apakah ada alat analisis statis untuk file sumber PHP? Biner itu sendiri dapat memeriksa kesalahan sintaks, tapi saya mencari sesuatu yang lebih, seperti:

  • tugas variabel yang tidak digunakan
  • array yang ditugaskan tanpa diinisialisasi terlebih dahulu
  • dan mungkin peringatan kode gaya
  • ...
Eswald
sumber
57
Righty-o: ditutup oleh SO, ketika jawaban seperti ini jelas sangat berguna.
Ira Baxter
3
setuju. Pertanyaan ini sangat penting. php lint (file php-l) gagal menyediakan separuh lainnya: jalankan autoload, pastikan fungsi yang dipanggil ada, variabel itu ada, properti objek ada. dll
Maks.
6
@IraBaxter berguna, tapi tidak, secara tegas, pada topik. softwarerecs.stackexchange.com mungkin merupakan lokasi yang lebih sesuai topik. Tentu saja ironi di sini adalah bahwa lebih banyak pengembang yang akrab dengan SO daripada saudara kandungnya ...
Wayne Werner
7
Fakta bahwa begitu banyak orang menganggap jenis pertanyaan ini bermanfaat mungkin adalah mengapa perangkat lunak sekarang ada. Tampaknya pada topik kembali ketika ini adalah satu-satunya situs pertukaran stack. Sekarang ada tempat yang jelas untuk itu, apakah masuk akal untuk bermigrasi?
eswald
4
Ditutup karena penutup pemicu-senang. Bah!
Roadowl

Jawaban:

356

Jalankan php dalam mode-lint dari baris perintah untuk memvalidasi sintaksis tanpa eksekusi:

php -l FILENAME

Analisis statis tingkat tinggi meliputi:

Analisis tingkat lebih rendah meliputi:

Analisis runtime, yang lebih berguna untuk beberapa hal karena sifat dinamis PHP, meliputi:

Dokumentasi perpustakaan phpdoc dan doxygen melakukan semacam analisis kode. Doxygen, misalnya, dapat dikonfigurasi untuk membuat grafik pewarisan yang bagus dengan graphviz .

Pilihan lain adalah xhprof , yang mirip dengan xdebug, tetapi lebih ringan, sehingga cocok untuk server produksi. Alat ini mencakup antarmuka berbasis PHP.

troelskn
sumber
20
+1 untuk mengambil 6 jam hidup saya dalam mencoba semua barang ini!
Abe Petrillo
14
@ Dimitko: Itu karena php -lhanya bisa membaca satu file input pada satu waktu (yaitu, itu tidak akan berfungsi jika Anda melakukannya php -l file1.php file2.php). Alih-alih, Anda perlu menggunakan -n 1opsi, yang xargshanya memberitahu untuk menggunakan satu jalur input per proses perintah. Alih-alih itu akan menyebabkannya berjalan php -l file1.phpdiikuti oleh php -l file2.php, secara terpisah. Pada saat yang sama, Anda dapat menggunakan -P <n>untuk menjalankan proses "n" pada suatu waktu, untuk memparalelkan eksekusi:find . -name '*.inc' -o -name '*.php' -print0 | xargs -0 -n1 -P10 php -l
Joe
11
find /your/path -name '*.php' -exec php -l {} \;bekerja andal.
Koen.
11
NB : Untuk built-in fungsi serat ( php -l) untuk bekerja, Anda harus mengatur display_errors = ondi php.ini, jika tidak, anda hanya akan mendapatkan pesan generik tentang ada menjadi kesalahan sintaks tetapi tidak ada rincian tentang apa yang error (s) atau apa line (s).
Synetech
8
Synetech - Bagus. Anda bisa mengesampingkan pengaturan pada baris perintah, menggunakan -dsakelar. Misalnyaphp -l -d display_errors=on $FILENAME
troelskn
38

Serat PHP online

PHPLint

Variabel unitialized diperiksa . Link 1 dan 2 sepertinya sudah melakukan ini dengan baik.

Saya tidak bisa mengatakan saya telah menggunakan semua ini secara intensif, :)

Martijn Laarman
sumber
Jawabannya membuat hari saya hari ini menjadi luar biasa! +1
Guilherme Nascimento
24

PHP Mess Detector luar biasa dan cepat.

aredridel
sumber
7
Terima kasih! Saya mencari yang luar biasa. Bahkan, saya menolak untuk menggunakan alat yang luar biasa. :)
Kontrak Prof. Falken dilanggar
1
Ini awal, dan sepertinya itulah yang digunakan Netbeans, tapi saya tidak akan percaya sepenuhnya. Beberapa opsinya benar-benar aneh ("memperingatkan" Anda jika Anda menggunakan pernyataan lain ??), dan ada banyak bug besar dalam pendeteksiannya, yang bahkan belum mendapat tanggapan dari pengembang: github.com/phpmd / phpmd / issues
NoBugs
selain itu menambah kompleksitas siklomatik dan seringkali dapat ditulis secara berbeda untuk menghindari dan lain-lain. misal if (true) {$ x = 1; } else {$ x = 2; } dapat ditulis ulang: $ x = 2; if (true) {$ x = 1; }
RichardAtHome
17

Saya telah mencoba menggunakan $ php -l dan beberapa alat lainnya. Namun yang terbaik dalam pengalaman saya (YMMV, tentu saja) adalah scheck of pfff toolset . Saya mendengar tentang pfff di Quora ( http://www.quora.com/Is-there-a-good-PHP-lint-static-analysis-tool )

Anda dapat mengkompilasi dan menginstalnya. Tidak ada paket yang bagus (di Debian mint saya, saya harus menginstal libpcre3-dev, ocaml, libcairo-dev, libgtk-3-dev dan dependensi libgimp2.0-dev terlebih dahulu) tetapi harus bernilai intsall.

Hasilnya dilaporkan seperti

rjha@mint ~ $ ~/sw/pfff/scheck ~/code/github/sc/
login-now.php:7:4: CHECK: Unused Local variable $title
go-automatic.php:14:77: CHECK: Use of undeclared variable $goUrl.
rjha94
sumber
Terima kasih. Itu terus mengeluh tentang impor dinamis kami, tetapi kemampuan lainnya terlihat bagus sejauh ini. Saya juga perlu menginstal binutils-gold, dan scheck perlu diinstal di jalur kustom, tetapi tampaknya berfungsi sekarang.
eswald
1
@ Eswald Sekarang, suatu hari saya adalah seorang php mess detector (phpmd) convert. Dari semua alat yang saya coba sejauh ini (sniffer kode php, scheck, php -l, phpmd), IMHO, phpmd berfungsi paling baik untuk kasus saya.
rjha94
Apakah Anda tahu di mana menemukan Scheck?
George Katsanos
1
@GeorgeKatsanos scheck adalah bagian dari pfff toolset. github.com/facebook/pfff
rjha94
2
Scheck selalu memberi saya kesalahan "pemeriksa php membutuhkan file grafik". Dokumentasi yang sebagian besar tidak ada tidak memiliki contoh.
Robert Bruce
14

Lihat CloneDR Semantic Designs , alat "deteksi kloning" yang menemukan kode salin / tempel / edit. Ini akan menemukan fragmen kode yang tepat dan dekat, terlepas dari spasi, komentar dan bahkan perubahan nama variabel. Contoh laporan deteksi untuk PHP dapat ditemukan di situs web tersebut. (Saya penulisnya).

Ira Baxter
sumber
1
Melihat situs itu, itu tampak seperti alat yang luar biasa. Saya akan melihat lebih dekat nanti! Terima kasih untuk tautannya (+1 untuk "Saya penulisnya")
Eric Cope
Kutukan dari setiap sarjana yang berkomplot.
wom
7

NetBeans IDE memeriksa kesalahan sintaks, variabel yang tidak dapat digunakan, dan semacamnya. Ini tidak otomatis, tetapi berfungsi dengan baik untuk proyek kecil atau menengah.

suka
sumber
6

Ada alat baru yang disebut nWire untuk PHP . Ini adalah plugin eksplorasi kode untuk Eclipse PDT dan Zend Studio 7.x. Ini memungkinkan analisis kode waktu-nyata untuk PHP dan menyediakan alat-alat berikut:

  • Visualisasi kode - representasi grafis interaktif dari komponen dan asosiasi.
  • Navigasi kode - tampilan navigasi unik menunjukkan semua asosiasi dan bekerja dengan Anda saat Anda menulis atau membaca kode.
  • Pencarian cepat - cari saat Anda mengetik metode, bidang, file, dll.
zvikico
sumber
1
itu tidak menjawab pertanyaan. seperti jawaban ada netbeans dll.
Yosef
5

PHP PMD (project mess detector) dan PHP CPD (copy paste detector) sebagai bagian dari PHPUnit

erenon
sumber
4

Ada RIPS - Penganalisa kode sumber statis untuk kerentanan dalam skrip PHP . Sumber-sumber RIPS tersedia di SourceForge .

Dari situs RIPS:

RIPS adalah alat yang ditulis dalam PHP untuk menemukan kerentanan dalam aplikasi PHP menggunakan analisis kode statis. Dengan tokenizing dan parsing semua file kode sumber RIPS mampu mengubah kode sumber PHP menjadi model program dan untuk mendeteksi sink sensitif (berpotensi rentan fungsi) yang dapat dinodai oleh userinput (dipengaruhi oleh pengguna jahat) selama aliran program. Selain output terstruktur dari kerentanan yang ditemukan, RIPS juga menawarkan kerangka kerja audit kode terintegrasi untuk analisis manual lebih lanjut.

SteAp
sumber
RIPS adalah proyek setengah mati dan hanya bekerja dengan kode php non-OOP.
alexglue
3

Ada alat yang benar-benar baru untuk analisis kode statis yang disebut PHP Analyzer .

Di antara banyak jenis analisis statis, ini juga menyediakan fungsi dasar perbaikan otomatis, lihat dokumentasi .

UPDATE: PHP-Analyzer sekarang sudah tidak digunakan lagi tetapi Anda masih bisa mengaksesnya di cabang lawas

fatganz
sumber
2

Anda mungkin ingin mencoba mengompilasi dengan hiphop Facebook.

Itu melakukan analisis statis pada seluruh proyek, dan mungkin apa yang Anda cari.

https://github.com/facebook/hiphop-php

Martin Konecny
sumber