编程语言
首页 > 编程语言> > 静态解析:判断两个Javascript函数是否相同

静态解析:判断两个Javascript函数是否相同

作者:互联网

我正在寻找一种方法,使用两个JavaScript函数的静态分析来判断它们是否相同.让我定义“相同”的多个定义.

等级1:除了可能的不同空格之外,功能是相同的,例如, TABS,CR,LF和SPACES.

级别2函数可能具有与级别1不同的空白,但也可能具有不同的变量名称.

3级???

对于第一级,我想我可以从包含两个JS函数定义的每个字符串中删除所有(非文字,可能很难)空白,然后比较字符串.

对于第二级,我想我需要使用类似于SpiderMonkey’s parser的东西来生成两个解析树,然后编写一个比较器,它可以遍历树并允许变量具有不同的名称.

[编辑]威利汉姆,在下面说明一点.我的意思是相同的.现在,我正在寻找一些实用的策略,特别是在使用解析树方面.

解决方法:

重新编辑:

为了阐述我对确定相同功能的建议,可以建议以下流程:

级别1:删除任何不属于字符串文字的空格;在每个{,;之后插入换行符和}并比较.如果相等;功能是相同的,如果不是:

第2级:将所有不依赖于同一作用域中定义的其他变量状态的变量声明和赋值移动到它们声明的作用域的开头(或者如果不想实际解析JS;则开始括号);并按行长排序;将所有变量名称处理为4个字符长,并且在绑定长度的情况下回退到按字母顺序忽略变量名称.按字母顺序重新排序所有集合,并重命名所有变量vSNN,其中v是文字,S是嵌套大括号的数量,NN是遇到变量的顺序.

相比;如果相等,则功能相同,如果不相同:

级别3:用“sNN”替换所有字符串文字,其中“和s是文字,NN是遇到字符串的顺序.比较;如果相等,则函数是相同的,如果不是:

级别4:根据字母顺序使用具有最高优先级的函数的名称来规范化已知相同的任何函数的名称(在下面的示例中,对p_strlen()的任何调用都将替换为c_strlen().如果需要,按照级别1重新排序.比较;如果相等,则功能相同,否则;功能几乎肯定不相同.

原始答案:

我想你会发现你的意思是“相同”,而不是“相同”.

正如您所发现的那样,差异至关重要:

如果按照某种规范化方式(删除非文字空格,将变量重命名和重新排序为规范化顺序,用占位符替换字符串文字,……),则两个函数是相同的,它们与字面上相等.

如果在为任何给定输入值调用时它们给出相同的返回值,则两个函数是相同的.在一般情况下,考虑一种编程语言,它计算了零终止字符串(混合Pascal / C字符串,如果你愿意的话).函数p_strlen(str)可能会查看字符串的字符数并返回该字符串.函数c_strlen(str)可能会计算字符串中的字符数并返回该字符串.

虽然这些函数肯定不相同,但它们将是相同的:对于任何给定(有效)的输入值,它们将给出相同的值.

我的观点是:

确定两个函数是相同的(你似乎想要实现的)是一个(适度)微不足道的问题,如你所描述的那样完成.

确定两个函数是否真的相同(你可能真正想要实现的)是非平凡的;事实上,它很简单,可能与Halting Problem相关,而不是静态分析可以完成的事情.

编辑:当然,相同的功能也是一样的;但是以完全分析的高度特异性且很少有用的方式.

标签:javascript,parsing,static-analysis
来源: https://codeday.me/bug/20190903/1797250.html