追踪分析解决办法

将追踪划分为序列

//思路:每个函数块的追踪在一个数组里,将每个函数追踪转化成序列。
//如果追踪中有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访问的序列

//根据ρ←(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访问

//在找到的序列中根据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);
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Nian糕的私人厨房

JavaScript 函数

通常来说,一个函数就是一个可以被外部代码调用(或者函数本身递归调用)的"子程序",和程序本身一样,一个函数的函数体是由一系列的语句组成的,函数可以接收传入参数,...

9330
来自专栏与神兽党一起成长

前序遍历树

代码来自:pickle and cPickle – Python object serialization 首先树的结构,如图

18220
来自专栏Golang语言社区

Golang方法和接口

在编程语言中,方法和函数的概念需要搞清楚。函数指的是一个封装的代码块,我们可以直接调用它,并返回结果。而方法其实也是一种函数,只不过方法需要和某个对象绑定。Go...

37170
来自专栏GreenLeaves

JS框架设计之对象类型判断一种子模块

Javascript有两套数据类型,一套是基础数据类型,一套是对象数据类型。基础数据类型包括5种基本数据类型,分别是null,bool,undefined,nu...

21080
来自专栏Golang语言社区

GO语言标准错误处理机制error用法实例

本文实例讲述了GO语言标准错误处理机制error用法。分享给大家供大家参考。具体分析如下: 在 Golang 中,错误处理机制一般是函数返回时使用的,是对外的接...

50580
来自专栏十月梦想

JavaScript中类的创建以及类的传参

在之前(ES2015)以前我们常用构造函数来搞定一个事物类,通过new 这个构造函数实现类的功能!在ES6(ES2015)中已经可以使用类,下面我们看一下类如何...

13620
来自专栏Golang语言社区

Go语言基本语法

前面已经看到了Go程序的基本结构,所以这将是很容易理解Go编程语言等基本构建块。 Go令牌 Go程序包括各种令牌和令牌可以是一个关键字,一个标识符,常量,字符串...

28860
来自专栏Golang语言社区

Golang指针与nil浅析

曾经听说过一句话,编程的本质就是指针和递归。那会刚开始编码,只是这两个的概念有个感性粗浅的认识。最早接触指针,莫过于C语言了,能否理解用好指针也成为一个合格C语...

31360
来自专栏运维小白

9.3 grep(下)

grep用法 grep 'r.o' test.txt grep 'oo*' test.txt grep '.*' test.txt grep 'o{2}' /e...

19650
来自专栏PHP在线

12个非常实用的JavaScript小技巧

在这篇文章中将给大家分享12个有关于JavaScript的小技巧。这些小技巧可能在你的实际工作中或许能帮助你解决一些问题。 使用!!操作符转换布尔值 有时候我们...

36080

扫码关注云+社区

领取腾讯云代金券