के लिए सीपीडी से चेतावनियों को दबाएं हम अपने सी और सी ++ कोड का विश्लेषण करने के लिए पीएमडी कॉपी पेस्ट डिटेक्टर (सीपीडी) का उपयोग कर रहे हैं। हालांकि, कोड के कुछ भाग बहुत समान हैं, लेकिन एक अच्छे कारण के साथ और हम इन भागों के लिए चेतावनियों को दबाना चाहते हैं।सी/सी ++ कोड
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
दुर्भाग्यपूर्ण। लेकिन पीएमडी * सभी के बाद जावा के लिए डिजाइन किया गया था। शायद क्लैंग स्थिर विश्लेषक (या कोई अन्य उपकरण) आपको बेहतर अनुकूलन प्रदान कर सकता है? – StoryTeller
मुझे क्लैंग में किसी भी कोड डुप्लिकेशन/"कॉपी पेस्ट डिटेक्टर" के बारे में पता नहीं है, इसलिए जहां तक मुझे पता है कि यह एक विकल्प नहीं है। –