2014-04-28 5 views
8

Perl’de yeniyim ve şu anda büyük ve oldukça dağınık bir Perl projesinin düzenlenmesi ve sürdürülmesi görevini üstleniyorum. Koddaki sorunları tespit etmeme yardımcı olmak için perl-critic kullanıyorum (ve ayrıca bana en iyi uygulamaları öğreteceğim).Perl koşullarında her zaman yanlış olarak değerlendirilen erişilemez kod nasıl algılanır?

Varolan kod, kodlayıcının ulaşılamaz bir kod oluşturduğu yerlere sahiptir. Örneğin, bunlar kod dallarının bazı açıklama haline tembel yolu olarak '& & 0' eklendi: (Ben perl veya Eleştirmen tür durumlarda ulaşılamaz kod hakkında beni uyarmak ümit ediyorum

if ($req->param('donut') && 0) { 
    unreachable code... 
} else { 
    always branches to here... 
} 

nerede koşullu, false değerini değerlendiren sabit bir değere sahiptir, ancak değildir.

Bu tür bir şeyi güvenilir şekilde algılayabilen bir araç veya bir komut parçası var mı?

Açıkçası ben kaynakta '& & 0' için arama olabilir ama kodlayıcı ulaşılamaz kod yaratabilirdi çeşitli yollar bir eğer açıklamaya ekleme '& & 0' yanında bulunmaktadır.

cevap

9

B::Deparse kullanarak, bazı durumlarda ulaşılmaz kodu algılayabilir: 0 ilk şart değilse

perl -MO=Deparse -e 'if (0 && $x) {print 1} else {print 2}' 
do { 
    print 2 
}; 
-e syntax OK 

Yine de o kadar kolay:

perl -MO=Deparse -e 'if ($x && 0) {print 1} else {print 2}' 
if ($x and 0) { 
    print 1; 
} 
else { 
    print 2; 
} 
-e syntax OK 

Neden farklı? Eh, 0 son gelirse, önce tüm koşullar kontrol edilmelidir. Halen devam edecek yan etkileri olabilir. Ayrıca, && bir skalar bağlamı zorlar, bu yüzden durumu değerlendirirken çağrılan kod davranışını değiştirebilir.

Bu, bloğun neden kendisinin neden derlenmediğini açıklamıyor, üzgünüm. Tahminimce çok karmaşık görünüyordu.

+0

+1'i vurgulayacaktır.Şartlılığın ilk kısmının yan etkisi bana açık olsa da (koşullu ifadenin kendisinin derlenemeyeceği anlamına gelir), koşulun ikinci kısmı tarafından getirilen bağlamın değişmesi hakkında bir şey fark etmemiştim. . –

5

Choroba'nın cevabına göre, B :: Deparse, kodun Perl derleyicisinin onu en iyi duruma getirdiği açık bir şekilde erişilemeyen durumları size gösterecektir. Ancak, genel durumda tespit etmek imkansız. Aşağıdaki kod etkili bir erişilemeyen blok içerir.

use 5.006; 

if ($] < 5) { ... } 

$] için use hattı ile en az 5.006 olması sağlanır Perl, şu anda çalışan versiyonu veren bir değişkendir. Fakat kaynak kodun statik analizini kullanarak bunu anlamak için oldukça zeki tekniklere ihtiyacınız var. (- bkz Acme::Futuristic::Perl - Bir kenara, alışılmadık bir şey yapmak her ne kadar gelince, çalışma zamanında $] değerini değiştirmek mümkündür. Kod ulaşılabilir hale gelecektir ki bu durumda)

Eğer iyi bir test paketi varsa Kodunuz için Devel::Cover yararlı olabilir. PERL5OPT ortam değişkenini -MDevel::Cover olarak ayarladıktan sonra test paketinizi çalıştırın (normalden biraz daha yavaş çalışır), ardından güzel bir HTML raporu oluşturacak olan cover komutunu çalıştırın. Bu rapor hangi substansın uygulanmadığını, hangi dalların hiç kullanılmadığını, vb., B :: Deparse hakkında beni bilgilendirmek için

İlgili konular