235 lines
7.4 KiB
JavaScript
235 lines
7.4 KiB
JavaScript
|
|
|||
|
var showAnalysis = function() {
|
|||
|
//console.log("showAnalysis test")
|
|||
|
var isAnalysis = document.getElementById("analysis").style.display;
|
|||
|
var isResize = document.getElementById("resize").style.display;
|
|||
|
//console.log(isAnalysis);
|
|||
|
var top = document.getElementById("contractCode");
|
|||
|
var down = document.getElementById("analysis");
|
|||
|
var box = document.getElementById("box");
|
|||
|
|
|||
|
if (isAnalysis == "none") {
|
|||
|
document.getElementById("analysis").style.display = "block";
|
|||
|
document.getElementById("resize").style.display = "block";
|
|||
|
var moveLen=300;
|
|||
|
top.style.height = moveLen + "px";
|
|||
|
$("#contractCode .CodeMirror").css("height",moveLen + "px");
|
|||
|
down.style.height = (box.clientHeight - moveLen - 10) + "px";
|
|||
|
staticAnalysis();
|
|||
|
} else {
|
|||
|
document.getElementById("analysis").style.display = "none";
|
|||
|
document.getElementById("resize").style.display = "none";
|
|||
|
top.style.height="100%";
|
|||
|
$("#contractCode .CodeMirror").css("height","100%");
|
|||
|
}
|
|||
|
//document.getElementById("analysis").style.display = "";
|
|||
|
};
|
|||
|
|
|||
|
var staticAnalysis = function() {
|
|||
|
var req = {};
|
|||
|
req.action = "getControlFlowByFileName";
|
|||
|
req.isPrivate = global.currentFile.isPrivate;
|
|||
|
var path = global.currentFile.path;
|
|||
|
if (path.startsWith("/"))
|
|||
|
path = path.substr(1);
|
|||
|
path = path.replace(/\/.*$/g,"");
|
|||
|
req.projectName = path;
|
|||
|
array = $("#form").serializeArray();
|
|||
|
req.formData=JSON.stringify(array);
|
|||
|
global.wssocket.send(JSON.stringify(req));
|
|||
|
};
|
|||
|
|
|||
|
window.onload = function(){
|
|||
|
var resize = document.getElementById("resize");
|
|||
|
var top = document.getElementById("contractCode");
|
|||
|
var down = document.getElementById("analysis");
|
|||
|
var box = document.getElementById("box");
|
|||
|
resize.onmousedown = function(e){
|
|||
|
var startY = e.clientY;
|
|||
|
resize.top = resize.offsetTop;
|
|||
|
|
|||
|
document.onmousemove = function(e){
|
|||
|
var endY = e.clientY;
|
|||
|
var moveLen = resize.top + (endY - startY);
|
|||
|
var maxT = box.clientHeight - resize.offsetHeight;
|
|||
|
if(moveLen<150) moveLen = 150;
|
|||
|
if(moveLen>maxT-150) moveLen = maxT-150;
|
|||
|
resize.style.top = moveLen;
|
|||
|
top.style.height = moveLen + "px";
|
|||
|
$("#contractCode .CodeMirror").css("height",top.style.height);
|
|||
|
down.style.height = (box.clientHeight - moveLen - 5) + "px";
|
|||
|
}
|
|||
|
document.onmouseup = function(evt){
|
|||
|
document.onmousemove = null;
|
|||
|
document.onmouseup = null;
|
|||
|
resize.releaseCapture && resize.releaseCapture();
|
|||
|
}
|
|||
|
resize.setCapture && resize.setCapture();
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
var onGetControlFlow = function(obj) {
|
|||
|
var data = {};
|
|||
|
data.name = data.path = "/tmp/result_" + (new Date().getTime() % 1000)
|
|||
|
+ ".txt";
|
|||
|
obj = JSON.parse(obj.result);
|
|||
|
global.analysisResult = obj;
|
|||
|
$("#analysisFunction").html("<option value=''>选择方法</option>");
|
|||
|
for (var key in obj){
|
|||
|
$("#analysisFunction").append("<option value='"+key+"'>"+key+"</option>");
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
data.val = JSON.stringify(obj, null, 4);
|
|||
|
mainVue.openedFiles.push(data);
|
|||
|
setTimeout(function() {
|
|||
|
clickTab(data.path);
|
|||
|
}, 100);
|
|||
|
}
|
|||
|
var showAnalysisResult = function(){
|
|||
|
var functionName = $("#analysisFunction")[0].value;
|
|||
|
if (global.analysisResult[functionName]!=undefined){
|
|||
|
drawMethod(global.analysisResult[functionName]);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
var drawMethod = function(method) {
|
|||
|
var states = {};
|
|||
|
for (var i = 0; i < method.blocks.length; i++) {
|
|||
|
var block = method.blocks[i];
|
|||
|
var desp = {};
|
|||
|
desp.description = "字节码指令:"+"<br/>"+ stmt2Str(block.stmts);
|
|||
|
desp.description += "<br/><br/>" + "后续分析结果:" +"<br/>" + block.result;
|
|||
|
desp.description += "<br/><br/>" + "源码:"+"<br/>"+ block.original;
|
|||
|
desp.description += "<br/><br/>" + "数据依赖:"+"<br/>"+ block.blockDep;
|
|||
|
if (block.type != "Continuous")
|
|||
|
desp.fill = "#f77";
|
|||
|
states[block.name] = desp;
|
|||
|
}
|
|||
|
drawCFGraph(states, method.edges);
|
|||
|
var retDesp = "数据值传递依赖:";
|
|||
|
//retDesp += method.ret;
|
|||
|
var tmp1 = method.ret;
|
|||
|
retDesp += tmp1.split(":")[tmp1.split(',').length];
|
|||
|
retDesp += "\n";
|
|||
|
retDesp += "数据控制依赖:";
|
|||
|
var tmp2= method.blocks[method.blocks.length-1].blockDep;
|
|||
|
//retDesp += tmp.split(":")[tmp.split(',').length];
|
|||
|
retDesp += tmp2;
|
|||
|
retDesp += "\n";
|
|||
|
retDesp += method.finalRet;
|
|||
|
document.getElementById("ret").value = retDesp;
|
|||
|
};
|
|||
|
|
|||
|
var stmt2Str = function(l) {
|
|||
|
var str = "";
|
|||
|
for (var i = 0; i < l.length; i++)
|
|||
|
str += "<span style='text-overflow:ellipsis'>"
|
|||
|
+ l[i].replace(/\//g, ".") + "</span>" + "<br/>";
|
|||
|
return str;
|
|||
|
}
|
|||
|
|
|||
|
var drawCFGraph = function(states, edges) {
|
|||
|
var g = new dagreD3.graphlib.Graph().setGraph({});
|
|||
|
// Add states to the graph, set labels, and style
|
|||
|
Object.keys(states).forEach(function(state) {
|
|||
|
var value = states[state];
|
|||
|
value.label = state;
|
|||
|
value.rx = value.ry = 5;
|
|||
|
value.style = "fill:white;stroke:"+primaryColor;
|
|||
|
g.setNode(state, value);
|
|||
|
});
|
|||
|
for (var i = 0; i < edges.length; i++){
|
|||
|
edges[i].label.style= "fill:#fff;stroke:"+primaryColor+";stroke-width:2px";
|
|||
|
if (edges[i].label.label=='e')
|
|||
|
edges[i].label.label = "";
|
|||
|
g.setEdge(edges[i].from, edges[i].to,edges[i].label);
|
|||
|
}
|
|||
|
// Set up the edges
|
|||
|
|
|||
|
// Create the renderer
|
|||
|
var render = new dagreD3.render();
|
|||
|
$("svg").html("");
|
|||
|
// Set up an SVG group so that we can translate the final graph.
|
|||
|
var svg = d3.select("svg"), inner = svg.append("g");
|
|||
|
|
|||
|
// Set up zoom support
|
|||
|
var zoom = d3.zoom().on("zoom", function() {
|
|||
|
inner.attr("transform", d3.event.transform);
|
|||
|
});
|
|||
|
svg.call(zoom);
|
|||
|
|
|||
|
// Simple function to style the tooltip for the given node.
|
|||
|
var styleTooltip = function(name, description) {
|
|||
|
return "<p class='name'>" + name + "</p><p class='description'>"
|
|||
|
+ description + "</p>";
|
|||
|
};
|
|||
|
|
|||
|
// Run the renderer. This is what draws the final graph.
|
|||
|
render(inner, g);
|
|||
|
|
|||
|
inner.selectAll("g.node").attr("title", function(v) {
|
|||
|
return styleTooltip(v, g.node(v).description)
|
|||
|
}).each(function(v) {
|
|||
|
$(this).tipsy({
|
|||
|
gravity : "w",
|
|||
|
opacity : 1,
|
|||
|
html : true
|
|||
|
});
|
|||
|
});
|
|||
|
|
|||
|
// Center the graph
|
|||
|
var initialScale = 0.75;
|
|||
|
var width =$("#svgCanvas").css("width").replace("px","")/1;
|
|||
|
svg.call(zoom.transform, d3.zoomIdentity.translate(
|
|||
|
(width - g.graph().width * initialScale) / 2, 20)
|
|||
|
.scale(initialScale));
|
|||
|
svg.attr('height', g.graph().height * initialScale + 40);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
var downloadAnalysis = function() {
|
|||
|
var pdf = new jsPDF('p', 'pt', 'a4');
|
|||
|
//page1
|
|||
|
/*
|
|||
|
pdf.addFont('NotoSansCJKtc-Regular.ttf', 'NotoSansCJKtc', 'normal');
|
|||
|
pdf.setFont('NotoSansCJKtc');
|
|||
|
*/
|
|||
|
pdf.text('Analysis Report', 10, 20);
|
|||
|
var res = document.getElementById("ret").value;
|
|||
|
pdf.text(res, 10, 20);
|
|||
|
//page2
|
|||
|
pdf.addPage();
|
|||
|
//method1:add text
|
|||
|
//get svg
|
|||
|
var svg = $("#svgCanvas")[0].outerHTML;
|
|||
|
if (svg)
|
|||
|
svg = svg.replace(/\r?\n|\r/g, '').trim();
|
|||
|
//change svg to canvas
|
|||
|
var canvas = document.createElement('canvas');
|
|||
|
ctx = canvas.getContext('2d');
|
|||
|
var v = canvg.Canvg.fromString(ctx, svg);
|
|||
|
|
|||
|
//create image
|
|||
|
var imgData = canvas.toDataURL('image/png');
|
|||
|
pdf.addImage(imgData, 'PNG', 0, 0, 595.28, 841.89);
|
|||
|
|
|||
|
/*
|
|||
|
//method2:add text to image
|
|||
|
var canvas = document.createElement('canvas');
|
|||
|
const ctx = canvas.getContext('2d');
|
|||
|
var svg = document.getElementById('svg-container').innerHTML;
|
|||
|
var v = canvg.Canvg.fromString(ctx, svg);
|
|||
|
v.start();
|
|||
|
ctx.font="20px Georgia";
|
|||
|
ctx.fillText(res, 10, 20);
|
|||
|
var imgData = canvas.toDataURL('image/png');
|
|||
|
pdf.addImage(imgData, 'PNG', 0, 0, 595.28, 841.89);
|
|||
|
*/
|
|||
|
pdf.save('report.pdf');
|
|||
|
}
|
|||
|
|