2014-04-28 2 views
8

मैं पर्ल के लिए नया हूं, और वर्तमान में एक बड़ी और सुंदर गन्दा पर्ल परियोजना को बनाए रखने और बनाए रखने के लिए काम कर रहा हूं। मैं कोड में मुद्दों का पता लगाने में मदद करने के लिए perl-crit का उपयोग कर रहा हूं (और मुझे सर्वोत्तम प्रथाओं को भी सिखाता हूं)।पर्ल सशर्त में पहुंचने योग्य कोड का पता लगाने के लिए जो हमेशा झूठे मूल्यांकन करता है?

मौजूदा कोड में ऐसे स्थान हैं जहां कोडर ने पहुंच योग्य कोड बनाया है। उदाहरण के लिए, वे कोड शाखाओं में से कुछ टिप्पणी की एक आलसी रास्ता के रूप में जोड़ा '& & 0':

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

मैं आशा व्यक्त की चाहते हैं कि पर्ल या आलोचक मुझे इस तरह के मामलों में नहीं पहुंचा जा सकता कोड के बारे में चेतावनी है (जहां एक सशर्त के पास झूठ का मूल्यांकन करने का निरंतर मूल्य होता है), लेकिन ऐसा नहीं होता है।

क्या कोई उपकरण या स्क्रिप्ट का एक टुकड़ा है जिसका उपयोग मैं कर सकता हूं जो इस तरह की चीज़ का विश्वसनीय रूप से पता लगा सकता है?

जाहिर है मैं स्रोत में '& & 0' के लिए खोज सकता है, लेकिन तरीके सांकेतिक शब्दों में बदलनेवाला नहीं पहुंचा जा सकता कोड बनाया है हो सकता है कि के एक नंबर एक अगर बयान को जोड़कर '& & 0' के अलावा हैं।

उत्तर

9

B::Deparse उपयोग करके, आप कुछ स्थितियों में पहुंच योग्य नहीं कोड का पता लगाने कर सकते हैं:

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

यह इतना आसान नहीं है, तो 0 पहली शर्त नहीं है, हालांकि है:

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

क्यों यह अलग है? खैर, अगर 0 आखिरी बार आता है, तो इससे पहले की सभी शर्तों की जांच की जानी चाहिए। उनके दुष्प्रभाव हो सकते हैं जो अभी भी होंगे। इसके अलावा, && एक स्केलर संदर्भ को मजबूर करता है, इसलिए यह स्थिति का मूल्यांकन करते समय कोड के व्यवहार को बदल सकता है।

यह स्पष्ट नहीं करता है कि क्यों ब्लॉक स्वयं संकलित नहीं है, क्षमा करें। मेरा अनुमान होगा कि यह बहुत जटिल लग रहा था।

+0

+1 मुझे बी :: डिपार्ट के बारे में सूचित करने के लिए +1।हालांकि सशर्त के पहले भाग का साइड इफेक्ट मुझे स्पष्ट था (जिसका अर्थ है कि सशर्त अभिव्यक्ति को स्वयं संकलित नहीं किया जा सकता है), मुझे सशर्त के दूसरे भाग द्वारा पेश किए गए संदर्भ को बदलने के बारे में एहसास नहीं हुआ था । –

5

कोरोबा के उत्तर के अनुसार, बी :: डिपार्ट आपको ऐसे मामलों को दिखाने में सक्षम होगा जहां कोड इतना स्पष्ट रूप से पहुंच योग्य नहीं है कि पर्ल कंपाइलर इसे अनुकूलित करता है। लेकिन, सामान्य मामले में यह पता लगाना असंभव है। निम्नलिखित कोड में प्रभावी रूप से पहुंचने योग्य ब्लॉक शामिल है।

use 5.006; 

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

क्योंकि $] एक चर जो पर्ल, जो कम से कम use लाइन द्वारा 5.006 होने की गारंटी है वर्तमान में चल रहे संस्करण रिटर्न है। लेकिन आपको स्रोत कोड के स्थिर विश्लेषण का उपयोग करके इसे समझने के लिए कुछ सुंदर चालाक तकनीकों की आवश्यकता होगी। (- देख Acme::Futuristic::Perl - एक अलग रूप में, हालांकि एक असामान्य बात करने के लिए के रूप में, यह रन-टाइम में $] का मूल्य बदलने के लिए संभव है। ऐसी स्थिति में कोड पहुंच योग्य हो जाएगा)

आप एक सभ्य टेस्ट स्वीट है, तो आपके कोड के लिए, Devel::Cover उपयोगी हो सकता है। आप पर्यावरण परिवर्तनीय PERL5OPT से -MDevel::Cover पर सेट करें, फिर अपना परीक्षण सूट चलाएं (ध्यान दें कि यह सामान्य से थोड़ा धीमा होगा), फिर cover कमांड चलाएं जो एक सुंदर HTML रिपोर्ट तैयार करेगी। यह रिपोर्ट हाइलाइट नहीं की जाएगी कि किस सब्स को निष्पादित नहीं किया गया था, जिनकी शाखाओं का कभी भी उपयोग नहीं किया गया था, आदि

संबंधित मुद्दे