追踪分析解决办法

2018-05-30 17:00:16 浏览数 (1)

将追踪划分为序列

代码语言:javascript复制
//思路:每个函数块的追踪在一个数组里,将每个函数追踪转化成序列。
//如果追踪中有ASYNC标记,则创建一个包含两个序列的新序列。
function TswitchS(arr){
    if(typeof arr === "Array"){
        Sequence = new Array();
        var FUNC="root";
        var j=0,k=0;//序列下标参数
        var SKIP=false;//FAILURE标记
        var asyncID = new Array();
        for(var i=0;i<arr.length;i  ){
            var arg0_length = arr[i][0].IndexOf(':');//返回某个指定的字符串值在字符串中首次出现的位置。
            var func = arr[i][0].substring(0,arg0_length);//用于提取字符串中介于两个指定下标之间的字符
            var arg1_length = arr[i][0].lastIndexOf(':');
            var funAsync = arr[i][0].substr(arg_length);
            if(testA(funAsync)){//处理异步调用
                var num = funAsync.substr(funAsync.length-1);//用于提取字符串中介于两个指定下标之间的字符
                if(typeof asyncID[num]==="Array"){
                    asyncID[num].push();
                }else{
                    asyncID[num] = new Array();
                    asyncID[num].push();
                }
            }
            if(func==FAILURE){//有FAILURE标记,此序列终止
                SKIP=true;
                Sequence[j][k  ]="FAILURE";
            }else if(func==FUNC&&!SKIP){//同一序列
                Sequence[j][k  ]="该行序列格式";
            }else{//开启新序列
                j  ;k=0;
                FUN=fun;
                SKIP=false;
                Sequence[j] = new Array();
                Sequence[j][k]="该行序列格式";
            }
        }
    }
}

//增则表达式匹配异步调用
function testA(text){  
    var result=text.indexOf("ASYNC");
     if(result!=-1){
        alert("ok");   
     }else{
      alert("err");  
     }                 
}

//获取异步调用ID号
function getID(str){
    if(typeof str ==="String"){
        var numColon = str.lastIndexOf(":");
        var strID = str.substr(numColon);
        return strID;
    }
}

查找包含直接DOM访问的序列

代码语言:javascript复制
//根据ρ←(l1,l2,...,ln)⇐⇒∃li∈{l1,l2,...,ln},li .f ailure = true(1)找到目标序列。
function test(text){  
    //  var   re =/?(w{1,}=w{1,}&){1,}w{1,}=w{1,}/;
    var   re =new RegExp("FAILURE$");
    var result=  re.test(text);
     if(result){
        alert("ok");   
     }else{
      alert("err");  
     }                 
}
function Screen(arr){
    var last = arr[arr.length-1];//获取最后一个元素
    if(test(last)){//选中序列
        var seq_num = last.IndexOf(':');//返回某个指定的字符串值在字符串中首次出现的位置。
        var seq = last.substring(0,seq_num);//用于提取字符串中介于两个指定下标之间的字符
        return seq;
    }
}
var Seq=new Array();
Seq=Sequence.filter(Screen(this));

定位直接DOM访问

代码语言:javascript复制
//在找到的序列中根据dynamic backword slicing寻找direct DOM access.
function findDOM(iid){
    if("是direct DOM access"){
        //该行(iid)标识为直接DOM访问
        return iid;
    }else{//不是direct DOM access,追踪变量保持null值
        if(iid.ASSIGN){//如果是赋值
            var stringIid=iid.code;
            text=text.replace(/s/ig,'');//去除字符串中的空格
            if(iid.name==null_var){//是关于null_var的赋值
                var a = stringIid.IndexOf('=');//返回某个指定的字符串值在字符串中首次出现的位置。
                var b = stringIid.IndexOf(';');//返回某个指定的字符串值在字符串中首次出现的位置。
                var new_var = stringIid.substring(a,b);//用于提取字符串中介于两个指定下标之间的字符
                null_var=new_var;
                return findDOM(iid-1);
            }else{
                return findDOM(iid-1);
            }
        }else if(iid.RETURN){//如果是return
            if(){//是关于null_var的赋值
                return findDOM(iid-1);
            }else{
                return findDOM(iid-1);
            }
        }else if(iid.FUNCTION){//如果是函数调用
            if(){//是关于null_var的赋值
                return findDOM(iid-1);
            }else{
                return findDOM(iid-1);
            }
        }else{//非以上情况,忽略
            return findDOM(iid-1);
        }
    }
}
dom

0 人点赞