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
  • ...

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.


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



24

PHP Mess Detector luar biasa dan cepat.


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.

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).


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.


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.

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


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.


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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.