Php statik kod analizi nasıl yapılır? [kapalı]


466

PHP kaynak dosyaları için statik analiz aracı var mı? İkili, sözdizimi hatalarını kontrol edebilir, ancak daha fazlasını yapan bir şey arıyorum, örneğin:

  • kullanılmayan değişken atamaları
  • önce başlatılmadan atanan diziler
  • ve muhtemelen kod stili uyarıları
  • ...

57
Righty-o: açıkça bu tür bir cevap inanılmaz derecede faydalı olduğunda SO tarafından kapatılır.
Ira Baxter

3
Katılıyorum. Bu soru çok önemli. php lint (php -l dosyası) diğer yarıyı sağlayamaz: otomatik yükü çalıştırın, adlı bir işlevin var olduğundan, değişkenlerin var olduğundan, nesne özelliklerinin var olduğundan emin olun. vb.
Maks

6
@IraBaxter konuyla ilgili faydalı, ancak kesinlikle konuşmuyor. softwarerecs.stackexchange.com muhtemelen daha konuyla ilgili bir konumdur. Elbette buradaki ironi, daha fazla geliştiricinin kardeşine kıyasla SO'ya aşinadır ...
Wayne Werner

7
Pek çok insanın bu tür bir soruyu yararlı bulması muhtemelen yazılımların neden var olduğudur. Bu tek yığın değişim sitesi olduğunda kesinlikle geri konu üzerinde görünüyordu. Şimdi bunun için açık bir yer olduğuna göre, göç etmek mantıklı mı?
eswald

4
Tetikleyici-mutlu kapatıcılar nedeniyle kapalı. Bah!
Roadowl

Yanıtlar:


356

Sözdizimini yürütmeden doğrulamak için php'yi komut satırından lint modunda çalıştırın:

php -l FILENAME

Yüksek seviye statik analizörler şunları içerir:

Alt seviye analizörleri şunları içerir:

PHP'nin dinamik yapısı nedeniyle bazı şeyler için daha kullanışlı olan çalışma zamanı analizörleri şunları içerir:

Phpdoc ve doxygen dokümantasyon kütüphaneleri bir tür kod analizi yapar. Doxygen, örneğin, güzel devralma grafikler işlemek için yapılandırılabilir graphviz .

Başka bir seçenek, xdebug'a benzer, ancak daha hafif olması, üretim sunucuları için uygun olmasını sağlayan xhprof'tur . Araç, PHP tabanlı bir arayüz içerir.


20
Tüm bu güzellikleri denerken hayatımın 6 saatini aldığınız için +1!
Abe Petrillo

14
@dimitko: Çünkü php -lbir kerede yalnızca bir girdi dosyasını okuyabilir (yani, eğer çalışırsa çalışmaz php -l file1.php file2.php). Bunun yerine -n 1, xargskomut işlemi başına yalnızca bir giriş satırı kullanmasını söyleyen seçeneği kullanmanız gerekir . Bunun yerine çalışmasına ve php -l file1.phpardından php -l file2.phpayrı ayrı çalışmasına neden olur . Aynı zamanda, -P <n>yürütmeyi paralel hale getirmek için bir seferde "n" işlemlerini çalıştırmak için kullanabilirsiniz :find . -name '*.inc' -o -name '*.php' -print0 | xargs -0 -n1 -P10 php -l
Joe

11
find /your/path -name '*.php' -exec php -l {} \;güvenilir çalışır.
Koen.

11
NB : Yerleşik tiftik fonksiyonu için ( php -lişe), ayarlamanız gerekir display_errors = onyılında php.ini, aksi takdirde sadece orada yaklaşık genel bir mesaj olmanın sözdizimi hataları ama ne hata (lar) ya da ne hat (lar) hakkında hiçbir bilgi alacak.
Synetech

8
Synetech - İyi olan. Bununla birlikte, -danahtarı kullanarak komut satırındaki ayarı geçersiz kılabilirsiniz . Egphp -l -d display_errors=on $FILENAME
troelskn



24

PHP Mess Dedektörü harika ve hızlı.


7
Teşekkür ederim! Harika bir yer arıyordum. Aslında, müthiş araçlar dışında bir şey kullanmayı reddediyorum. :)
Prof. Falken sözleşmesi

1
Bu bir başlangıç ​​ve Netbeans'in kullandığı gibi görünüyor, ama tamamen güvenmem. Seçeneklerinden bazıları sadece tuhaf (başka bir ifade kullanıyorsanız "uyarı" ??) ve tespitlerinde geliştiricilerin yanıtı bile olmayan çok sayıda büyük hata var: github.com/phpmd / phpmd / konular
16:15 NoBugs

başka döngüsel karmaşıklık ekler ve önlemek ve başka önlemek için genellikle farklı yazılabilir. örneğin, (true) {$ x = 1; } başka {$ x = 2; } yeniden yazılabilir: $ x = 2; eğer (true) {$ x = 1; }
RichardAtHome

17

$ Php -l ve birkaç başka araç kullanmayı denedim. Ancak deneyimlerime göre en iyisi (YMMV, elbette) pfff araç setinin yükü . Quora'da pfff'yi duydum ( http://www.quora.com/Is-there-a-good-PHP-lint-static-analysis-tool )

Derleyebilir ve yükleyebilirsiniz. Güzel paketler yok (nane Debian'ımda, önce libpcre3-dev, ocaml, libcairo-dev, libgtk-3-dev ve libgimp2.0-dev bağımlılıklarını yüklemem gerekiyordu) ama bir intsall'a değer olmalı.

Sonuçlar şöyle bildirilir:

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.

Teşekkür ederim. Dinamik ithalatlarımızdan şikayet etmeye devam ediyor, ancak diğer yetenekleri şimdiye kadar iyi görünüyor. Ayrıca binutils-gold yüklemem gerekiyordu ve scheck'in özel bir yola yüklenmesi gerekiyordu, ancak şimdi çalışıyor gibi görünüyor.
eswald

1
@eswald Şimdi bir gün ben bir php karışıklık dedektörü (phpmd) dönüştürmek. Şimdiye kadar denedim tüm araçlar (php kod sniffer, scheck, php -l, phpmd), IMHO, phpmd benim durumum için en iyi çalışır.
rjha94

Scheck'i nerede bulacağınızı biliyor musunuz?
George Katsanos

1
@GeorgeKatsanos scheck pfff araç setinin bir parçasıdır. github.com/facebook/pfff
rjha94

2
Scheck her zaman bana "php denetleyicisi bir grafik dosyasına ihtiyacı var" hatası verir. Çoğunlukla varolmayan belgelerin hiçbir örneği yoktur.
Robert Bruce

14

"Kopyala / yapıştır / düzenlenmiş kodu bulan" klon algılama "aracı olan Semantic Designs 'CloneDR'ye bakın . Boşluk, yorumlar ve hatta değişken yeniden adlandırmalarına rağmen tam ve yakın özledim kod parçalarını bulacak. Web sitesinde PHP için bir örnek tespit raporu bulunabilir. (Ben yazarım).


1
Siteye bakıldığında, bu inanılmaz bir araç gibi görünüyor. Daha sonra daha yakından bakacağım! Bağlantı için teşekkürler ("Ben de yazarım" için +1)
Eric Cope

Bağlayan herhangi bir undergrad'ın bane.
wom

7

NetBeans IDE sözdizimi hatalarını, kullanılmayan değişkenleri ve benzerlerini kontrol eder. Otomatik değildir, ancak küçük veya orta ölçekli projeler için iyi çalışır.


6

PHP için nWire adında yeni bir araç var . Eclipse PDT ve Zend Studio 7.x için bir kod keşif eklentisidir. PHP için gerçek zamanlı kod analizini mümkün kılar ve aşağıdaki araçları sağlar:

  • Kod görselleştirme - bileşenlerin ve ilişkilendirmelerin etkileşimli grafik gösterimi.
  • Kod gezinme - benzersiz gezinme görünümü, tüm ilişkilendirmeleri gösterir ve siz kodu yazarken veya okurken sizinle birlikte çalışır.
  • Hızlı arama - yöntem, alan, dosya vb. Yazarken arama yapın.

1
bu sorunun cevabı değil. gibi cevap var netbeans vb ..
Yosef

5

PHPUnit'in eski kısmı olarak PHP PMD (proje karışıklık dedektörü) ve PHP CPD (kopyala yapıştır dedektörü)


4

PHP komut dosyalarındaki güvenlik açıkları için statik bir kaynak kodu çözümleyicisi olan RIPS var . SourceForge'da bulunan RIPS kaynakları .

RIPS sitesinden:

RIPS, statik kod analizi kullanarak PHP uygulamalarındaki güvenlik açıklarını bulmak için PHP'de yazılmış bir araçtır. Tüm kaynak kod dosyalarını tokenleştirerek ve ayrıştırarak RIPS, PHP kaynak kodunu bir program modeline dönüştürebilir ve program akışı sırasında userinput (kötü niyetli bir kullanıcı tarafından etkilenen) tarafından azaltılabilen hassas lavaboları (potansiyel olarak savunmasız fonksiyonlar) tespit edebilir. Bulunan güvenlik açıklarının yapılandırılmış çıktısının yanı sıra, RIPS ayrıca daha fazla manuel analiz için entegre bir kod denetim çerçevesi sunmaktadır.


RIPS yarı ölü bir projedir ve sadece OOP olmayan php kodu ile çalışır.
alexglue

3

PHP Analyzer adlı statik kod analizi için kesinlikle yeni bir araç var .

Birçok statik analiz türü arasında temel otomatik sabitleme işlevi de sunar, belgelere bakın .

GÜNCELLEME: PHP-Analyzer artık kullanımdan kaldırıldı, ancak yine de eski şubeden erişebilirsiniz


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.