2016-06-03 23 views
6

के लिए सीपीडी से चेतावनियों को दबाएं हम अपने सी और सी ++ कोड का विश्लेषण करने के लिए पीएमडी कॉपी पेस्ट डिटेक्टर (सीपीडी) का उपयोग कर रहे हैं। हालांकि, कोड के कुछ भाग बहुत समान हैं, लेकिन एक अच्छे कारण के साथ और हम इन भागों के लिए चेतावनियों को दबाना चाहते हैं।सी/सी ++ कोड

documentation of PMD CPD केवल एनोटेशन के बारे में कुछ बताता है, लेकिन यह हमारी इन भाषाओं के लिए काम नहीं करेगा।

मैं अभी भी विशिष्ट भागों के लिए चेतावनियों को कैसे अनदेखा कर सकता हूं?

क्या ऐसा करने के लिए कोई टिप्पणी है?

[अद्यतन] मैं सीपीडी को चलाने के लिए निम्नलिखित ग्रूवी स्क्रिप्ट का उपयोग कर रहा हूँ:

@GrabResolver(name = 'jcenter', root = 'https://jcenter.bintray.com/') 
@Grab('net.sourceforge.pmd:pmd-core:5.4.+') 
@Grab('net.sourceforge.pmd:pmd-cpp:5.4.+') 
import net.sourceforge.pmd.cpd.CPD 
import net.sourceforge.pmd.cpd.CPDConfiguration 
import java.util.regex.Pattern 

def tokens = 60 
def scanDirs = ['./path/to/scan', './scan/this/too'] 
def ignores = [ 
    './ignore/this/path', 
    './this/must/be/ignored/too' 
    ].collect({ it.replace('/', File.separator) }) 
def rootDir = new File('.') 
def outputDir = new File('./reports/analysis/') 

def filename_date_format = 'yyyyMMdd' 
def encoding = System.getProperty('file.encoding') 
def language_converter = new CPDConfiguration.LanguageConverter() 
def config = new CPDConfiguration() 
config.language = new CPDConfiguration.LanguageConverter().convert('c') 
config.minimumTileSize = tokens 
config.renderer = config.getRendererFromString 'xml', 'UTF-8' 
config.skipBlocksPattern = '//DUPSTOP|//DUPSTART' 
config.skipLexicalErrors = true 
def cpd = new CPD(config) 

scanDirs.each { path -> 
    def dir = new File(path); 
    dir.eachFileRecurse(groovy.io.FileType.FILES) { 
     // Ignore file? 
     def doIgnore = false 
     ignores.each { ignore -> 
      if(it.path.startsWith(ignore)) { 
       doIgnore = true 
      } 
     } 
     if(doIgnore) { 
      return 
     } 

     // Other checks 
     def lowerCaseName = it.name.toLowerCase() 
     if(lowerCaseName.endsWith('.c') || lowerCaseName.endsWith('.cpp') || lowerCaseName.endsWith('.h')) { 
      cpd.add it 
     } 
    } 
} 

cpd.go(); 

def duplicationFound = cpd.matches.hasNext() 

def now = new Date().format(filename_date_format) 
def outputFile = new File(outputDir.canonicalFile, "cpd_report_${now}.xml") 
println "Saving report to ${outputFile.absolutePath}" 

def absoluteRootDir = rootDir.canonicalPath 
if(absoluteRootDir[-1] != File.separator) { 
    absoluteRootDir += File.separator 
} 

outputFile.parentFile.mkdirs() 
def xmlOutput = config.renderer.render(cpd.matches); 
if(duplicationFound) { 
    def filePattern = "(<file\\s+line=\"\\d+\"\\s+path=\")${Pattern.quote(absoluteRootDir)}([^\"]+\"\\s*/>)" 
    xmlOutput = xmlOutput.replaceAll(filePattern, '$1$2') 
} else { 
    println 'No duplication found.' 
} 

outputFile.write xmlOutput 

उत्तर

2

GitHub पर PMD के कोड के माध्यम से खोज के बाद, मुझे लगता है कि मैं सुरक्षित रूप से कह सकते हैं कि यह है नहीं समय पर इस बिंदु पर समर्थित (वर्तमान संस्करण पीएमडी 5.5.0 है)।

CPD-START उनके भंडार में एक खोज, pmd-cpp निर्देशिका के भीतर कोई परिणाम नहीं दिखाता है (the search results on GitHub देखें)।

+0

दुर्भाग्यपूर्ण। लेकिन पीएमडी * सभी के बाद जावा के लिए डिजाइन किया गया था। शायद क्लैंग स्थिर विश्लेषक (या कोई अन्य उपकरण) आपको बेहतर अनुकूलन प्रदान कर सकता है? – StoryTeller

+0

मुझे क्लैंग में किसी भी कोड डुप्लिकेशन/"कॉपी पेस्ट डिटेक्टर" के बारे में पता नहीं है, इसलिए जहां तक ​​मुझे पता है कि यह एक विकल्प नहीं है। –

3

आप --skip-blocks-pattern विकल्प के माध्यम से विश्लेषण से कुछ ब्लॉक को छोड़कर अपने कस्टम मार्कर को परिभाषित कर सकते हैं।

--skip-ब्लॉक-पैटर्न पैटर्न को छोड़ने के लिए ब्लॉकों को खोजने के लिए। स्टार्ट एंड एंड पैटर्न द्वारा अलग किया गया | डिफ़ॉल्ट #if 0|#endif है।

उदाहरण के लिए निम्नलिखित /* SUPPRESS CPD START */ और /* SUPPRESS CPD END */ टिप्पणियां (टिप्पणी एक अलग लाइन पर कब्जा करना होगा) के बीच ब्लॉक पर ध्यान नहीं देगा:

$ ./run.sh cpd --minimum-tokens 100 --files /path/to/c/source --language cpp ----skip-blocks-pattern '/* SUPPRESS CPD START */|/* SUPPRESS CPD END */' 

नोट यह है कि इस उपकरण का कारण होगा कॉपी-पेस्ट का पता लगाने के लिए प्रदर्शन कोड के अंदर #if 0/#endif द्वारा संकीर्ण कोड।

+0

मैं आज बाद में कोशिश करूंगा। मेरा मानना ​​है कि एक और उपकरण पहले से ही यह देखने के लिए परीक्षण करता है कि "#if 0" का उपयोग किया जाता है, क्योंकि हमने पहले से ही परिभाषित किया है कि इसका उपयोग नहीं किया जाना चाहिए। ध्यान दें कि मैं सीपीडी चलाने के लिए एक कस्टम ग्रोवी स्क्रिप्ट का उपयोग कर रहा हूं, इसलिए मुझे यह समझने की आवश्यकता होगी कि जब मैं अपनी स्क्रिप्ट से 'CPD.go (config)' कह रहा हूं तो इसे कैसे पास किया जाए। –

+0

मैंने 'skipBlocksPattern' विकल्प सहित सीपीडी चलाने के लिए उपयोग की जाने वाली स्क्रिप्ट को शामिल करने के लिए मूल पोस्ट को अपडेट किया है। दुर्भाग्यवश, यह मेरे लिए काम नहीं कर रहा है (अभी तक?)। जल्द ही इसकी जांच करेगा, मुझे उम्मीद है। –

-1

मुझे सीपीडी के लिए कोई मदद नहीं है। आम तौर पर, मुझे ऐसे औजारों के बारे में पता है; मुझे "चेतावनियों" के बारे में कुछ समझ में नहीं आता है।

हमारे CloneDR tool finds exact and near-miss duplicate code। आईएमएचओ, यह सीपीडी की तुलना में बेहतर क्लोन पाता है, क्योंकि यह एक गाइड के रूप में भाषा वाक्यविन्यास/संरचना का उपयोग करता है। [इस तथ्य का समर्थन किसी तीसरे पक्ष द्वारा की गई एक शोध रिपोर्ट द्वारा किया जाता है जिसे आप साइट पर पा सकते हैं]। और यह "चेतावनियां" जारी नहीं करता है।

यदि कोड है जो यह सोचता है कि क्लोन में शामिल है, तो उपकरण शामिल क्लोन के लिए आउटपुट रिपोर्ट पेज उत्पन्न करेगा। लेकिन यह एक चेतावनी नहीं है। रिपोर्टिंग व्यवहार को दबाने का कोई तरीका नहीं है। जाहिर है, अगर आपने ऐसा क्लोन देखा है और यह तय नहीं है कि यह दिलचस्प नहीं है, तो आप एक क्लोन प्रविष्टियों में से एक को टिप्पणी के साथ चिह्नित कर सकते हैं जिसमें कहा गया है कि यह एक अनिच्छुक क्लोन है; वह टिप्पणी क्लोन रिपोर्ट में दिखाई देगी। (इस तरह की) टिप्पणियों पर क्लोनरोड द्वारा क्लोन का पता लगाने के लिए कोई फर्क नहीं पड़ता है, इसलिए उन्हें जोड़कर गणना किए गए उत्तर को नहीं बदला जाता है।

+0

ठीक है, मैं इसे एक चेतावनी कहते हैं, लेकिन मूल रूप से सीपीडी भी करता है। यह बस पाए गए क्लोनों को सूचीबद्ध करता है और इसे उस सूची से "बहिष्कृत" करने के लिए कहने का एक तरीका है (इस प्रकार "चेतावनी" को दबाना)। क्या यह उपकरण सादे सी के लिए भी काम करता है? –

+0

हां, यह विभिन्न प्रकार की भाषाओं के लिए काम करता है, जैसे सादे सी के लिए। कभी-कभी (सी के लिए) आपको खराब संरचना प्रीप्रोसेसर निर्देशों को संभालने के लिए इसे थोड़ा कॉन्फ़िगरेशन डेटा प्रदान करना होगा। कुछ उदाहरणों के लिए https://www.semanticdesigns.com/Products/Formatters/CPreprocessorConstraints.html देखें। मॉडुलो कि यह बहुत अच्छी तरह से काम करता है। –

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