125 lines
3.4 KiB
Python
125 lines
3.4 KiB
Python
#!/usr/bin/env python
|
|
import sys
|
|
import re
|
|
|
|
if len(sys.argv) != 3:
|
|
print('usage: triage.py project resultsfile.txt')
|
|
sys.exit(1)
|
|
|
|
project = sys.argv[1]
|
|
resultfile = sys.argv[2]
|
|
|
|
f = open(project + '/true-positives.txt', 'rt')
|
|
truepositives = f.read()
|
|
f.close()
|
|
|
|
f = open(project + '/false-positives.txt', 'rt')
|
|
falsepositives = f.read()
|
|
f.close()
|
|
|
|
fin = open(resultfile, 'rt')
|
|
results = fin.read()
|
|
fin.close()
|
|
|
|
out = {
|
|
'untriaged': '',
|
|
'fn': '',
|
|
'fp': '',
|
|
'tp': ''
|
|
}
|
|
|
|
numberOfFalsePositives = 0
|
|
numberOfTruePositives = 0
|
|
numberOfFalseNegatives = 0
|
|
|
|
for result in results.split('\n'):
|
|
result = result.strip()
|
|
|
|
res = re.match('\\[(' + project + '.+):([0-9]+)\\]:\s+[(][a-z]+[)] (.+)', result)
|
|
if res is None:
|
|
continue
|
|
|
|
filename = res.group(1)
|
|
linenr = res.group(2)
|
|
message = res.group(3)
|
|
css = 'untriaged'
|
|
classification = 'Untriaged'
|
|
if result in truepositives:
|
|
css = 'tp'
|
|
classification = 'True Positive'
|
|
numberOfTruePositives += 1
|
|
elif result in falsepositives:
|
|
css = 'fp'
|
|
classification = 'False Positive'
|
|
numberOfFalsePositives += 1
|
|
href = None
|
|
|
|
html = ' <tr>'
|
|
html += '<td class=' + css + '>' + filename + '</td>'
|
|
html += '<td class=' + css + '>' + linenr + '</td>'
|
|
html += '<td class=' + css + '>' + message + '</td>'
|
|
if project == 'linux-3.11':
|
|
href = 'http://github.com/torvalds/linux/blob/v3.11' + filename[filename.find('/'):] + '#L' + linenr
|
|
if href:
|
|
html += '<td class=' + css + '><a href="' + href + '">' + classification + '</a></td>'
|
|
else:
|
|
html += '<td class=' + css + '>' + classification + '</td>'
|
|
html += '</tr>\n'
|
|
|
|
out[css] += html
|
|
|
|
f = open(project + '/true-positives.txt', 'rt')
|
|
for line in f.readlines():
|
|
line = line.strip()
|
|
if '] -> [' in line or '(error)' not in line:
|
|
continue
|
|
|
|
res = re.match('\\[(' + project + '.+):([0-9]+)\\]:\s+[(][a-z]+[)] (.+)', line)
|
|
if res is None:
|
|
continue
|
|
|
|
if line in results:
|
|
continue
|
|
|
|
numberOfFalseNegatives += 1
|
|
|
|
filename = res.group(1)
|
|
linenr = res.group(2)
|
|
message = res.group(3)
|
|
classification = 'False Negative'
|
|
css = 'fn'
|
|
|
|
html = ' <tr>'
|
|
html += '<td class=' + css + '>' + filename + '</td>'
|
|
html += '<td class=' + css + '>' + linenr + '</td>'
|
|
html += '<td class=' + css + '>' + message + '</td>'
|
|
html += '<td class=' + css + '>' + classification + '</td>'
|
|
html += '</tr>\n'
|
|
|
|
out[css] += html
|
|
|
|
f.close()
|
|
|
|
project2 = ''
|
|
if '-' in project:
|
|
project2 = project[:project.find('-')]
|
|
else:
|
|
project2 = project
|
|
|
|
fout = open('report.html', 'wt')
|
|
fout.write('<html><head><title>Cppcheck results for ' + project +
|
|
'</title><link rel="stylesheet" type="text/css" href="theme1.css"></head><body>\n')
|
|
fout.write('<h1>Cppcheck results for ' + project + '</h1>\n')
|
|
fout.write('<p>Number of false negatives: ' + str(numberOfFalseNegatives) + '</p>\n')
|
|
fout.write('<p>Number of true positives: ' + str(numberOfTruePositives) + '</p>\n')
|
|
fout.write('<p>Number of false positives: ' + str(numberOfFalsePositives) + '</p>\n')
|
|
fout.write('<table border="0">\n')
|
|
fout.write('<tr><th>Filename</th><th>Line</th><th>Message</th><th>Classification</th></tr>\n')
|
|
fout.write(out['fn'])
|
|
fout.write(out['tp'])
|
|
fout.write(out['fp'])
|
|
fout.write(out['untriaged'])
|
|
|
|
fout.write('</table></body></html>')
|
|
fout.close()
|