function HashTable() {
let size = 0;
let entry = new Object();
this.add = function (key, value) {
if (!this.containsKey(key)) {
size++;
}
entry[key] = value;
};
this.getValue = function (key) {
return this.containsKey(key) ? entry[key] : null;
};
this.remove = function (key) {
if (this.containsKey(key) && (delete entry[key])) {
size--;
}
};
this.containsKey = function (key) {
return (key in entry);
};
this.containsValue = function (value) {
for (var prop in entry) {
if (entry[prop] == value) {
return true;
}
}
return false;
};
this.getValues = function () {
var values = new Array();
for (var prop in entry) {
values.push(entry[prop]);
}
return values;
};
this.getKeys = function () {
var keys = new Array();
for (var prop in entry) {
keys.push(prop);
}
return keys;
};
this.getSize = function () {
return size;
};
this.clear = function () {
size = 0;
entry = new Object();
}
}
let myuser;
let lines;
let routineTab = new HashTable();
let vulTypeCount = new HashTable();
let fileCount = new HashTable();
$(document).ready(function () {
let outhtml;
try {
outhtml = $(window.frames["opencc_vul"].document).html();
}catch (e) {
outhtml = $(window.frames["opencc_vul"].document)[0].body.innerHTML
}
if(outhtml === "" || outhtml == undefined || outhtml == null || outhtml.length == 0){
$.ajax({url: "opencc_vul.txt"}).done(display_content);
} else {
display_content(outhtml);
}
});
function display_content(s){
let answer = s;
let i = 0;
let count = 0;
let one_obj = {};
let obj_list = [];
let all_lines = "";
lines = answer.split("\n");
for(i = 0; i < lines.length ; i++){
let n = lines[i].match(/[a-zA-Z\._:0-9]+/g);
if(n != null) {
let res = {}; // One line of result
res.filename = n[0];
res.vultype = n[4];
res.variate = n[8];
res.subroutine = n[9];
res.lineno = n[1];
if(!routineTab.containsKey
(res.subroutine+"+"+res.variate+"+"+res.filename))
{
// Repetition Check Passes
routineTab.add(res.subroutine+"+"+res.variate+"+"+res.filename, res.vultype);
obj_list.push(res);
all_lines += `L ${res.lineno} - ${res.filename}
`;
count ++;
if(vulTypeCount.containsKey(res.vultype)){
let vul_list = vulTypeCount.getValue(res.vultype);
vul_list.push(res);
}else{
let vul_list = new Array();
vul_list.push(res);
vulTypeCount.add(res.vultype, vul_list);
}
if(fileCount.containsKey(res.filename)){
let vul_list = fileCount.getValue(res.filename);
vul_list.push(res);
}else{
let vul_list = new Array();
vul_list.push(res);
fileCount.add(res.filename, vul_list);
}
}
}
}
showToPage();
}
function showToPage() {
let s = "";
let keys = fileCount.getKeys();
let one = [];
let doms = "";
for (i = 0; i
${file_name}
${file_count}
`;
}
function showVul() {
let vul_data = [];
let i = 0;
let keys = vulTypeCount.getKeys();
for(i = 0 ; i < vulTypeCount.getSize(); i++){
vul_data.push({name: keys[i], y:vulTypeCount.getValue(keys[i]).length});
}
Highcharts.chart('container1', {
chart: {
plotBackgroundColor: null,
plotBorderWidth: null,
plotShadow: false,
type: 'pie'
},
title: {
text: 'Vulnerabilities Per Category'
},
tooltip: {
pointFormat: '{series.name}: {point.percentage:.1f}%'
},
plotOptions: {
pie: {
allowPointSelect: true,
cursor: 'pointer',
dataLabels: {
enabled: false
},
showInLegend: true
}
},
series: [{
name: 'Category',
colorByPoint: true,
data: vul_data
}]
});
}
function showFiles() {
let vul_file = [];
let vul_count = [];
let i = 0;
let keys = fileCount.getKeys();
for(i = 0 ; i < fileCount.getSize(); i++){
vul_file.push(keys[i]);
vul_count.push(fileCount.getValue(keys[i]).length);
}
var chart = Highcharts.chart('container2', {
chart: {
zoomType: 'xy'
},
title: {
text: 'Vulnerabilities Per File '
},
subtitle: {
text: ' AliOS-Things '
},
xAxis: [{
categories: vul_file,
crosshair: true
}],
yAxis: [{ // Primary yAxis
labels: {
format: '{value} risks',
style: {
color: Highcharts.getOptions().colors[1]
}
},
title: {
text: 'Count',
style: {
color: Highcharts.getOptions().colors[1]
}
}
}],
tooltip: {
shared: true
},
// legend: {
// layout: 'vertical',
// align: 'left',
// verticalAlign: 'top',
// y: 100,
// floating: true,
// backgroundColor: (Highcharts.theme && Highcharts.theme.legendBackgroundColor) || '#FFFFFF'
// },
series: [{
name: 'Per File',
type: 'column', /**spline */
data: vul_count,
tooltip: {
valueSuffix: ' risks'
}
}]
});
}
function showDetial(file_name){
let vul = fileCount.getValue(file_name);
let all_html = "";
$("#modal-title").text(file_name + " Detail");
for(i= 0 ; i < vul.length; i ++){
all_html += ` In function ${vul[i].subroutine},
Line ${vul[i].lineno},
${vul[i].variate} -
${trans(vul[i].vultype)}
`;
}
$("#file-detial").html(all_html);
$("#modal-detial").modal('show');
}
function trans(tp){
if(tp == "NPD"){
return "Null Pointer Dereference";
}else if(tp == "UIV"){
return "Uninitialized Variable";
}
}