英语原文共 10 页
摘 要
背景:Android是一种基于Java的编程语言,是嵌入式和移动设备的操作系统,其上层是用Android语言编写的。作为一种编程语言,它具有扩展的基于事件的库以及来自声明性XML布局文件的图形视图的动态膨胀。Android程序的静态分析器必须考虑这些功能,以确保正确性和精确性。
目的:我们的目标是扩展基于抽象解释的Julia静态分析器,以对Android程序进行正式的正确分析。本文深入介绍了这种扩展,我们面临的困难以及我们获得的结果。
方法:我们扩展了Julia分析器的类分析,它是许多其他分析的核心,通过考虑一些Android关键特定功能,例如程序的许多入口点的潜在存在以及从XML到反射的图形视图的膨胀。我们还显着提高了Android程序的归零度分析的精确度。
结果:我们已经与Julia分析了Google的大部分Android示例应用程序以及一些较大的开源程序。我们已经应用了数十个静态分析,包括分类广播,死代码,空值和终止分析。Julia自动发现了Google样本和开源应用程序中的漏洞,漏洞和效率低下的问题。
结论:Julia是第一款适用于Android程序的静态声学分析器,基于抽象解释等正式基础。我们的结果表明,它可以分析真正的第三方Android应用程序,无需任何用户注释代码,在最多7 分钟和标准硬件上产生正式的正确结果。因此,它已准备好进行第一次工业用途。
第一章 绪论
Android是移动和嵌入式设备(如手机,平板电脑和电视)操作系统市场的主要参与者。它是这种设备的操作系统,其上层是用编程语言编写的,也称为Android。作为一种语言,Android是具有用于移动和交互式应用程序的扩展库的Java,因此基于事件驱动的体系结构。任何Java编译器都可以编译Android应用程序,但必须将生成的Java字节码转换为最终的,非常优化的Dalvik字节码,以便在设备上运行。
Android应用程序的静态分析非常重要,因为质量和可靠性是Android市场成功的关键[2]。越野车应用程序获得负面反馈,并立即被潜在用户丢弃。因此,Android程序员希望确保他们的程序没有错误,例如他们不会抛出任何意外的异常并且不会挂起设备。但是Android应用程序也越来越多地部署在关键环境中,即使在军事场景中,安全性和可靠性也是最重要的。出于这样的原因,像Klocwork这样的工业演员[16]已经将其静态分析工具从Java扩展到Android,获得了我们所知道的Android唯一的静态分析。就我们可以从他们的网页推断而言,它的功率相对有限。我们无法获得免费评估许可。
诸如Klocwork之类的工具基于语法检查。这意味着,错误被寻找的代码的典型语法模式,通常包含一个错误识别。语法检查的使用导致非常快速和实用的分析。但是,当错误代码不遵循分析器已知的预定义模式时,它无法识别错误。这种情况与Julia这样的语义工具相反,在这些工具中发现了基于正式方法的工具的人工智能无法证明的错误程序片段不包含错误。第二种情况要复杂得多,计算成本也要高,但可以保证结果的合理性:如果没有找到潜在的错误(某些类),那么代码中就没有该类的错误。换句话说,语法工具很快但不健全。这两种方法都会发出错误警报,即潜在的错误,实际上并不是真正的错误。精密(即,真正的bug量WRT警告的数量)是关键的问题在这里,因为假警报的数量不应该压倒工具的用户。大多数静态分析工具的开发人员都承认这一点。例如,我们可以引用Coverity的网页[7]:“通过提供业界最准确的分析解决方案和最低的误报率,您可以专注于真实和相关的缺陷而不是浪费开发周期”。因此,静态分析仪的开发者的大部分努力都是为了减少误报的数量。这对于声音分析仪来说要困难得多,因为它们不仅可以丢弃警告而且还能保持稳定。无论如何,Klocwork等公司在这个市场上的存在表明,业界认识到Android代码静态分析的重要性。
SCanDroid工具[14]采用了更科学的方法,目前仅限于Android应用程序的安全验证。它执行Android应用程序的信息流分析,通过意图跟踪组件间通信,以及通过应用程序联盟潜在的非法获取安全权限。它的基础是对代码的基于约束的分析,并且有一个健全性保证,至少对于受限制的字节码类型。Klocwork目前不对Android应用程序执行任何信息流分析。
Julia是一个基于抽象解释的Java字节码静态分析器[6],自动确保分析的应用程序不包含大量编程错误。它适用于非平凡的整个程序,过程间和语义静态分析,包括分类广播,死代码,空值和终止分析。它具有正确性保证,因为抽象解释社区通常就是这种情况:如果应用程序包含分析器考虑的错误,那么Julia将报告它。这使得分析结果更加重要。尽管Java和Android是相同的语言,但是具有不同的库集,Julia对Android的应用并不是立竿见影的,我们必须在Julia以正确和精确的方式分析Android程序之前解决许多问题。许多与不同的图书馆集有关,其他人则使用XML来构建应用程序的一部分。在本文中,我们将这些问题与我们的解决方案一起展示出来,并表明最终系统可以高精度地分析非平凡的Android程序,并发现第三方代码中的错误。本文没有详细描述Julia提供的静态分析,已经在其他地方发布,但只是对分析器及其分析的Android的适应性。特别是我们的课堂分析,其核心是 但只适用于分析仪及其分析的Android。特别是我们的课堂分析,其核心是 但只适用于分析仪及其分析的Android。特别是我们的课堂分析,其核心是[27]中描述了简单的检查,如分类广播和死代码分析。我们的零点分析在[25],[26]中描述 ; 我们的终止分析在[28]中描述。
必须指出的是,我们的Julia分析器在存在反射,重新定义Java和多线程的类加载机制时并不健全。这并不意味着无法分析使用这些功能的程序,只能说结果可能不正确。实际上,我们工作的一个主要成就是向Julia讲授在Android中的XML布局膨胀期间完成的反射的具体用法,以便在这种情况下分析结果仍然合理(但不适用于反射的其他用途) )。
我们的分析器假设一个封闭的世界假设,例如,它假设在入口点变量可能绑定到与其声明类型兼容的每个类,可能以任何可能的方式共享或保持null。对于可以扩展的库以及可以通过子类化修改其行为的库,不能进行相同的假设。因此,我们不是对库的模块化分析,因为我们只分析完整(封闭)的Android应用程序。
有许多静态分析器能够分析Java源代码并发现错误或效率低下。他们中的大多数是基于句法分析(Checkstyle [4],Coverity [7],FindBugs [11],[3],PMD [23])或使用定理证明与一些简化(和一般不健全)的假设(ESC / Java [12])。由于Android语言是Java,只有库发生了变化,因此原则上可以将这些分析器应用于Android源代码。但是,正如我们在下一节中所示,有一些新的语言特性,例如XML膨胀,这些工具无法理解这些特性并影响程序控制流程图的相同构造,通常通过类型推断分析来执行被称为阶级分析 [20]; Android代码中存在许多新类型的错误,因为库的使用方式不是典型的Java。因此,静态分析器假定这些特征不存在并且不会发生这些缺陷(不健全)或者必须以合理的方式处理它们。我们认为我们在本文中强调的解决方案也可以应用于那些静态分析仪,因为它们不仅限于我们选择的特定静态分析仪。
本文的其余部分安排如下。第2节证明了Android程序静态分析的难度。第3节介绍了与本文相关的Android概念。第4节介绍了我们在Android代码上执行的更相关的静态分析。第5类分析为Android,6点NULL的含量分析为Android,Android的7个终止分析描述我们如何提高朱莉娅在Android上工作。特别是,第5节讨论了在存在XML膨胀的情况下通过类分析构建声音控制流图。第8节介绍了标准Google发行版和大型开源项目中许多非平凡Android程序的实验结果; 它表明Julia在这些程序中发现了一些实际的错误。第9节总结了论文。本文是2011年CADE上提交的较短会议论文的扩展版本[22]。第8节的完整实验评估没有出现在[22]中。而且,第4组静态的分析,我们应用,第5类分析为Android,为Android 6种NULL的含量分析提供的我们扩展朱莉娅方式更深的介绍,相对于对应的部分[22].
Julia是一种商业产品(http://www.juliasoft.com),可以通过公司网站提供的网络界面自由使用,其功能受到超时和最大分析的限制。Fausto Spoto是该公司的董事长,他于2010年11月成立。他也是Julia软件的主要开发人员。Eacute;tiennePayet目前是Reunion(法国)的副教授。他不是Julia Srl的成员,但他经常与Fausto Spoto就科学问题进行合作。
第二章 Android静态分析的挑战
Android程序的分析非常简单,因为我们必须考虑Android的一些特定功能,无论是正确性还是分析精度。
首先,Julia分析Java字节码,而Android应用程序以Dalvik字节码发布。有从Dalvik到Java字节码的翻译器(例如undx [24]和dex2jar [8])。但是在Eclipse IDE [9]中开发的Android应用程序总是可以以jar格式导出,即以Java字节码形式导出。Eclipse是目前Android的标准开发环境,因此我们更倾向于从Eclipse生成jar文件。
另一个问题是,当Android程序从许多事件处理程序开始时,Julia从其主要方法开始分析程序。对于某些基于事件的Java程序,例如使用actionPerformed的 Swing程序,这也是一个问题事件处理程序。这对于Android代码来说更成问题,其中整个程序通过通常通过反射调用的事件处理程序来工作,因此它们实际上可能看起来像是不能理解反射的静态分析器的死代码。因此,我们必须修改Julia,以便从所有这些处理程序开始分析,将它们视为潜在的并发入口点。必须说明Android事件处理程序是由单个线程执行的,因此我们不必考虑分析多线程应用程序的难题。从最坏情况假设分析入口点,例如说明它们的参数和接收器可以属于与其静态类型兼容的任何类,或者可以始终为空或保持重叠的数据结构。
一个更复杂的问题是Android使用的XML文件的用户界面的声明性规范。这意味着该代码是不是在字节码格式完全可用,而是被充气,在运行时,从XML布局文件到实际的字节码,通过使用Java反射。认为布局代码只包含与静态分析无关的图形方面,不能低估这个问题。相反,在Android程序中,XML充气类,如视图,菜单和首选项,包含应用程序的大部分甚至所有代码,包括其业务逻辑。此外,XML膨胀代码和显式应用程序代码之间的链接引入了强制转换和潜在的空指针异常。因此,如果我们希望它是正确的,分析器必须详细考虑XML通胀。
最后,真正的挑战是库的大小:通常,Android程序使用受限制的Java。*和新的android。*等级制度。他们的课程必须与课程一起进行分析,这很容易导致10,000种方法或更多方法的分析。
第三章 Android基础知识
我们在这里仅描述了本文中有用的Android概念。有关更多信息,请参阅[1]。
Android应用程序是用Java编写的,并在自己的虚拟机中运行。它们没有单一的入口点,但可以按需使用其他Android应用程序的一部分,并且可以通过直接或通过操作系统调用其事件处理程序来要求其服务。特别是,Android应用程序包含活动(通过可视界面与用户交互的代码),服务(不与用户交互的后台操作),内容提供者(数据库等数据容器)和广播接收者(对广播消息作出反应的对象) 。事件处理程序没有特定的排序,有一些值得注意的例外,例如生命周期 的活动。
XML 清单文件注册应用程序的组件。其他XML文件描述了活动的可视布局。活动通过Android库提供的inflater 将布局文件扩展为可视对象(视图层次结构)。这意味着库或用户定义的视图不是由新语句显式创建的,而是通过反射膨胀。findViewById等库方法访问膨胀的视图。作为一个例子,考虑图1中的活动,来自Android 2.2的Google发行版。onCreate首次创建活动时,在Android系统隐式调用其构造函数之后,将调用事件处理程序。所述的setContentView库方法调用布局充气机; 其整数参数唯一标识图2所示的XML布局文件。从图2中的文件的第3行可以清楚地看出,在图1的第9行标识为月球的视图属于用户定义的视图类com.example.android.lunarlander.LunarView。因此,图1中第9行的演员是正确的。常量R.layout.lunar _ layout和R.id.lunar在编译时自动从XML布局文件名和它们包含的视图标识符生成。用户可以在代码中多次调用setContentView ; 他可以将任何整数表达式的值传递给它和findViewById,尽管通常的方法是传递编译器生成的常量。对象的这种声明性构造也适用于首选项(图形应用程序选项)和菜单。
图1 源代码的一部分Android文件LunarLander.java。
图2 XML布局文件lunar_layout.xml。
第四章 我们所应用的静态分析集
我们在这里描述了我们让Julia应用于Android程序的主要分析。与前两个相比,前六个相对简单。除了纯粹语法的方法重新定义检查之外,它们都利用了在提取应用程序期间已经执行的类分析,该分析计算了程序的控制流图的过度近似。因此,他们利用有关该计划的语义,整个程序和程序间信息。
这些分析并不新鲜。它们是面向对象代码的非常着名的静态分析,已经由Klocwork,Coverity和F
资料编号:[5331]
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。