JSNice:Predicting Program Properties from “Big Code”

  • 发表:ACM SIGPLAN Notices(POPL), 2015, 苏黎世联邦理工学院计算机科学系Software Reliability Lab,Andreas Krause团队(https://scholar.google.com/citations?user=eDHv58AAAAAJ)(https://www.sri.inf.ethz.ch/research/plml)
  • 工具: http://jsnice.org (未完全开源)
  • 内容概括

  文章通过“大代码”来预测程序属性,即名称和类型。首先,从现有数据中学习概率模型;然后,利用该模型对新、未见过的程序进行属性预测。关键思想:将输入程序转化为一种表示形式(程序依赖图),从而将推测程序属性问题转为结构化预测问题。结果:正确预测63%的标识符名称,正确注释81%的类型。

  整个推理过程如下:

  1.确定已知和未知属性

  JS代码中包含各类代码元素,如变量、常量、类、方法名等。判断JS脚本中的任意元素的属性是否已知是首要问题。JSNice采用程序分析和人工指定的方式判断;JS中的常量(constants)、对象属性名(objects properties)、方法名(methods)和全局变量名(global variables)被认为已知,而所有局部变量属性被认为是未知。(这样的划分合理性有待分析?)

  2.建立依赖网络

  建立元素之间关系主要有三类:

  (1)句法关系(relating expressions)

  通过AST树获取;

 (2)别名关系(aliasing relations)

  通过standard alias analysis,将方法被调用时传入的arguments和方法声明时的parameters(待推测)关联,形成ARG_TO_PM关系;

  (3)函数名称关系(function name relationships)

  定义了MAY_CALL和MAY_ACCESS关系,主要用来预测函数名。MAY_CALL关联函数名f和它调用的其他函数g的名字;MAY_ACCESS关联函数名f和访问对象的字段fld。实现方法是程序分析。

  3.训练和推理

  简单来说,JSNice主要使用两个函数,candidates函数用来做“联想”,即先在依赖图中找到和变量有关系的relation和a,然后根据这两个信息在训练集汇中找和v最相似的词作为候选;scoreEdges函数用来推理,对不同候选属性计算score并选择最大score。

  4.评估

  从github上收集不相交的JS程序集,作为训练和评估数据集(分别包含10517/50个项目,324501/2710个文件)。使用UglifyJS处理得到混淆JS。名字预测评价指标是accuracy,类型预测评价指标是recall和precision,类型的ground truth 通过人工注释。

 

 

posted @ 2024-04-15 14:51  向日葵*1  阅读(21)  评论(0编辑  收藏  举报