Update cppcheck-htmlreport (#2494)
* Try to use double quotes consistently * minor CSS consistency changes * fix HTML errors * fix a few JS issues and switch to `textContent` * use `addEventListener` instead of the onload event * use `querySelector` and `querySelectorAll` Co-authored-by: XhmikosR <xhmikosr@gmail.com>
This commit is contained in:
parent
7c7b0e55ed
commit
103532bb03
|
@ -48,12 +48,12 @@ h1 {
|
|||
}
|
||||
|
||||
.inconclusive {
|
||||
background-color: #B6B6B4;
|
||||
background-color: #b6b6b4;
|
||||
}
|
||||
|
||||
.inconclusive2 {
|
||||
background-color: #B6B6B4;
|
||||
border: 1px dotted black;
|
||||
background-color: #b6b6b4;
|
||||
border: 1px dotted #000;
|
||||
display: inline-block;
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
@ -71,8 +71,8 @@ div.verbose div.content {
|
|||
margin: 4px;
|
||||
max-width: 40%;
|
||||
white-space: pre-wrap;
|
||||
border: 1px solid black;
|
||||
background-color: #FFFFCC;
|
||||
border: 1px solid #000;
|
||||
background-color: #ffffcc;
|
||||
cursor: auto;
|
||||
}
|
||||
|
||||
|
@ -114,21 +114,21 @@ div.verbose div.content {
|
|||
z-index: 1;
|
||||
}
|
||||
|
||||
#filename {
|
||||
#filename {
|
||||
margin-left: 10px;
|
||||
font: 12px;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.highlighttable {
|
||||
background-color:white;
|
||||
background-color: #fff;
|
||||
z-index: 10;
|
||||
position: relative;
|
||||
margin: -10 px;
|
||||
}
|
||||
|
||||
#content {
|
||||
background-color: white;
|
||||
background-color: #fff;
|
||||
-webkit-box-sizing: content-box;
|
||||
-moz-box-sizing: content-box;
|
||||
box-sizing: content-box;
|
||||
|
@ -141,7 +141,7 @@ div.verbose div.content {
|
|||
}
|
||||
|
||||
#content_index {
|
||||
background-color: white;
|
||||
background-color: #fff;
|
||||
-webkit-box-sizing: content-box;
|
||||
-moz-box-sizing: content-box;
|
||||
box-sizing: content-box;
|
||||
|
@ -155,7 +155,7 @@ div.verbose div.content {
|
|||
|
||||
.linenos {
|
||||
border-right: thin solid #aaa;
|
||||
color: lightgray;
|
||||
color: #d3d3d3;
|
||||
padding-right: 6px;
|
||||
}
|
||||
|
||||
|
@ -173,7 +173,7 @@ div.verbose div.content {
|
|||
"""
|
||||
|
||||
HTML_HEAD = """
|
||||
<!DOCTYPE html>
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
|
@ -182,93 +182,107 @@ HTML_HEAD = """
|
|||
<style>
|
||||
%s
|
||||
</style>
|
||||
<script language="javascript">
|
||||
function getStyle(el,styleProp) {
|
||||
<script>
|
||||
function getStyle(el, styleProp) {
|
||||
var y;
|
||||
if (el.currentStyle)
|
||||
var y = el.currentStyle[styleProp];
|
||||
y = el.currentStyle[styleProp];
|
||||
else if (window.getComputedStyle)
|
||||
var y = document.defaultView.getComputedStyle(el,null).getPropertyValue(styleProp);
|
||||
y = document.defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
|
||||
return y;
|
||||
}
|
||||
|
||||
function toggle() {
|
||||
var el = this.expandable_content;
|
||||
var mark = this.expandable_marker;
|
||||
if (el.style.display == "block") {
|
||||
|
||||
if (el.style.display === "block") {
|
||||
el.style.display = "none";
|
||||
mark.innerHTML = "[+]";
|
||||
mark.textContent = "[+]";
|
||||
} else {
|
||||
el.style.display = "block";
|
||||
mark.innerHTML = "[-]";
|
||||
mark.textContent = "[-]";
|
||||
}
|
||||
}
|
||||
|
||||
function init_expandables() {
|
||||
var elts = document.getElementsByClassName("expandable");
|
||||
for (var i = 0; i < elts.length; i++) {
|
||||
var elts = document.querySelectorAll(".expandable");
|
||||
|
||||
for (var i = 0, len = elts.length; i < len; i++) {
|
||||
var el = elts[i];
|
||||
var clickable = el.getElementsByTagName("span")[0];
|
||||
var marker = clickable.getElementsByClassName("marker")[0];
|
||||
var content = el.getElementsByClassName("content")[0];
|
||||
var clickable = el.querySelector("span");
|
||||
var marker = clickable.querySelector(".marker");
|
||||
var content = el.querySelector(".content");
|
||||
var width = clickable.clientWidth - parseInt(getStyle(content, "padding-left")) - parseInt(getStyle(content, "padding-right"));
|
||||
content.style.width = width + "px";
|
||||
clickable.expandable_content = content;
|
||||
clickable.expandable_marker = marker;
|
||||
clickable.onclick = toggle;
|
||||
clickable.addEventListener("click", toggle);
|
||||
}
|
||||
}
|
||||
function set_class_display(c, st) {
|
||||
var elements = document.querySelectorAll('.' + c),
|
||||
len = elements.length;
|
||||
for (i = 0; i < len; i++) {
|
||||
elements[i].style.display = st;
|
||||
}
|
||||
}
|
||||
function toggle_class_visibility(id) {
|
||||
var box = document.getElementById(id);
|
||||
set_class_display(id, box.checked ? '' : 'none');
|
||||
}
|
||||
function toggle_all(){
|
||||
var elts = document.getElementsByTagName("input");
|
||||
for (var i = 1; i < elts.length; i++) {
|
||||
var el = elts[i];
|
||||
el.checked ? el.checked=false : el.checked=true;
|
||||
toggle_class_visibility(el.id);
|
||||
}
|
||||
}
|
||||
|
||||
function set_class_display(c, st) {
|
||||
var elements = document.querySelectorAll("." + c);
|
||||
|
||||
for (var i = 0, len = elements.length; i < len; i++) {
|
||||
elements[i].style.display = st;
|
||||
}
|
||||
}
|
||||
|
||||
function toggle_class_visibility(id) {
|
||||
var box = document.getElementById(id);
|
||||
set_class_display(id, box.checked ? "" : "none");
|
||||
}
|
||||
|
||||
function toggle_all() {
|
||||
var elts = document.querySelectorAll("input");
|
||||
|
||||
for (var i = 1; i < elts.length; i++) {
|
||||
var el = elts[i];
|
||||
if (el.checked) {
|
||||
el.checked = false;
|
||||
} else {
|
||||
el.checked = true;
|
||||
}
|
||||
toggle_class_visibility(el.id);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("load", init_expandables);
|
||||
</script>
|
||||
</head>
|
||||
<body onload="init_expandables()">
|
||||
<div id="header">
|
||||
<h1>Cppcheck report - %s: %s </h1>
|
||||
</div>
|
||||
<div id="menu" dir="rtl">
|
||||
<p id="filename"><a href="index.html">Defects:</a> %s</p>
|
||||
<body>
|
||||
<div id="header">
|
||||
<h1>Cppcheck report - %s: %s </h1>
|
||||
</div>
|
||||
<div id="menu" dir="rtl">
|
||||
<p id="filename"><a href="index.html">Defects:</a> %s</p>
|
||||
"""
|
||||
|
||||
HTML_HEAD_END = """
|
||||
</div>
|
||||
<div id="content">
|
||||
</div>
|
||||
<div id="content">
|
||||
"""
|
||||
|
||||
HTML_FOOTER = """
|
||||
</div>
|
||||
<div id="footer">
|
||||
<p>
|
||||
Cppcheck %s - a tool for static C/C++ code analysis</br>
|
||||
</br>
|
||||
Internet: <a href="http://cppcheck.net">http://cppcheck.net</a></br>
|
||||
IRC: <a href="irc://irc.freenode.net/cppcheck">irc://irc.freenode.net/cppcheck</a></br>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer">
|
||||
<p>
|
||||
Cppcheck %s - a tool for static C/C++ code analysis<br>
|
||||
<br>
|
||||
Internet: <a href="http://cppcheck.net">http://cppcheck.net</a><br>
|
||||
IRC: <a href="irc://irc.freenode.net/cppcheck">irc://irc.freenode.net/cppcheck</a><br>
|
||||
</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
|
||||
HTML_ERROR = "<span class='error2'><--- %s</span>\n"
|
||||
HTML_INCONCLUSIVE = "<span class='inconclusive2'><--- %s</span>\n"
|
||||
HTML_ERROR = "<span class=\"error2\"><--- %s</span>\n"
|
||||
HTML_INCONCLUSIVE = "<span class=\"inconclusive2\"><--- %s</span>\n"
|
||||
|
||||
HTML_EXPANDABLE_ERROR = "<div class='verbose expandable'><span class='error2'><--- %s <span class='marker'>[+]</span></span><div class='content'>%s</div></div>\n"""
|
||||
HTML_EXPANDABLE_INCONCLUSIVE = "<div class='verbose expandable'><span class='inconclusive2'><--- %s <span class='marker'>[+]</span></span><div class='content'>%s</div></div>\n"""
|
||||
HTML_EXPANDABLE_ERROR = "<div class=\"verbose expandable\"><span class=\"error2\"><--- %s <span class=\"marker\">[+]</span></span><div class=\"content\">%s</div></div>\n"""
|
||||
HTML_EXPANDABLE_INCONCLUSIVE = "<div class=\"verbose expandable\"><span class=\"inconclusive2\"><--- %s <span class=\"marker\">[+]</span></span><div class=\"content\">%s</div></div>\n"""
|
||||
|
||||
# escape() and unescape() takes care of &, < and >.
|
||||
html_escape_table = {
|
||||
|
@ -518,7 +532,7 @@ if __name__ == '__main__':
|
|||
filename.split('/')[-1]))
|
||||
|
||||
for error in sorted(errors, key=lambda k: k['line']):
|
||||
output_file.write("<a href='%s#line-%d'> %s %s</a>" % (data['htmlfile'], error['line'], error['id'], error['line']))
|
||||
output_file.write("<a href=\"%s#line-%d\"> %s %s</a>" % (data['htmlfile'], error['line'], error['id'], error['line']))
|
||||
|
||||
output_file.write(HTML_HEAD_END)
|
||||
try:
|
||||
|
@ -528,8 +542,8 @@ if __name__ == '__main__':
|
|||
lexer = guess_lexer(content)
|
||||
except ClassNotFound:
|
||||
sys.stderr.write("ERROR: Couldn't determine lexer for the file' " + source_filename + " '. Won't be able to syntax highlight this file.")
|
||||
output_file.write("\n <tr><td colspan='5'> Could not generated content because pygments failed to retrieve the determine code type.</td></tr>")
|
||||
output_file.write("\n <tr><td colspan='5'> Sorry about this.</td></tr>")
|
||||
output_file.write("\n <tr><td colspan=\"5\"> Could not generate content because pygments failed to determine the code type.</td></tr>")
|
||||
output_file.write("\n <tr><td colspan=\"5\"> Sorry about this.</td></tr>")
|
||||
continue
|
||||
|
||||
if options.source_encoding:
|
||||
|
@ -572,7 +586,7 @@ if __name__ == '__main__':
|
|||
except IndexError:
|
||||
cnt_min = 0
|
||||
|
||||
stat_fmt = "\n <tr><td><input type='checkbox' onclick='toggle_class_visibility(this.id)' id='{}' name='{}' checked></td><td>{}</td><td>{}</td></tr>"
|
||||
stat_fmt = "\n <tr><td><input type=\"checkbox\" onclick=\"toggle_class_visibility(this.id)\" id=\"{}\" name=\"{}\" checked></td><td>{}</td><td>{}</td></tr>"
|
||||
for occurrences in reversed(range(cnt_min, cnt_max + 1)):
|
||||
for _id in [k for k, v in sorted(counter.items()) if v == occurrences]:
|
||||
stat_html.append(stat_fmt.format(_id, _id, dict(counter.most_common())[_id], _id))
|
||||
|
@ -591,16 +605,16 @@ if __name__ == '__main__':
|
|||
output_file.write('\n <tr><th>Line</th><th>Id</th><th>CWE</th><th>Severity</th><th>Message</th></tr>')
|
||||
for filename, data in sorted(files.items()):
|
||||
if filename in decode_errors: # don't print a link but a note
|
||||
output_file.write("\n <tr><td colspan='5'>%s</td></tr>" % (filename))
|
||||
output_file.write("\n <tr><td colspan='5'> Could not generated due to UnicodeDecodeError</td></tr>")
|
||||
output_file.write("\n <tr><td colspan=\"5\">%s</td></tr>" % (filename))
|
||||
output_file.write("\n <tr><td colspan=\"5\"> Could not generated due to UnicodeDecodeError</td></tr>")
|
||||
else:
|
||||
if filename.endswith('*'): # assume unmatched suppression
|
||||
output_file.write(
|
||||
"\n <tr><td colspan='5'>%s</td></tr>" %
|
||||
"\n <tr><td colspan=\"5\">%s</td></tr>" %
|
||||
(filename))
|
||||
else:
|
||||
output_file.write(
|
||||
"\n <tr><td colspan='5'><a href='%s'>%s</a></td></tr>" %
|
||||
"\n <tr><td colspan=\"5\"><a href=\"%s\">%s</a></td></tr>" %
|
||||
(data['htmlfile'], filename))
|
||||
|
||||
for error in sorted(data['errors'], key=lambda k: k['line']):
|
||||
|
@ -614,7 +628,7 @@ if __name__ == '__main__':
|
|||
|
||||
try:
|
||||
if error['cwe']:
|
||||
cwe_url = "<a href='https://cwe.mitre.org/data/definitions/" + error['cwe'] + ".html'>" + error['cwe'] + "</a>"
|
||||
cwe_url = "<a href=\"https://cwe.mitre.org/data/definitions/" + error['cwe'] + ".html\">" + error['cwe'] + "</a>"
|
||||
except KeyError:
|
||||
cwe_url = ""
|
||||
|
||||
|
@ -686,7 +700,7 @@ if __name__ == '__main__':
|
|||
continue
|
||||
except KeyError:
|
||||
continue
|
||||
stats_file.write("<p>Top 10 files for " + sev + " severity, total findings: " + str(_sum) + "</br>\n")
|
||||
stats_file.write("<p>Top 10 files for " + sev + " severity, total findings: " + str(_sum) + "<br>\n")
|
||||
|
||||
# sort, so that the file with the most severities per type is first
|
||||
stats_list_sorted = sorted(stats_templist.items(), key=operator.itemgetter(1, 0), reverse=True)
|
||||
|
@ -699,7 +713,7 @@ if __name__ == '__main__':
|
|||
if (it == 0):
|
||||
LENGTH = len(str(i[1])) # <- length of longest number, now get the difference and try to make other numbers align to it
|
||||
|
||||
stats_file.write(" " * 3 + str(i[1]) + " " * (1 + LENGTH - len(str(i[1]))) + "<a href=\"" + files[i[0]]['htmlfile'] + "\"> " + i[0] + "</a></br>\n")
|
||||
stats_file.write(" " * 3 + str(i[1]) + " " * (1 + LENGTH - len(str(i[1]))) + "<a href=\"" + files[i[0]]['htmlfile'] + "\"> " + i[0] + "</a><br>\n")
|
||||
it += 1
|
||||
if (it == 10): # print only the top 10
|
||||
break
|
||||
|
|
Loading…
Reference in New Issue