Android程序的静态分析外文翻译资料

 2022-07-31 14:14:08

英语原文共 10 页,剩余内容已隐藏,支付完成后下载完整资料


Android程序的静态分析

Eacute;tienne Payet , Fausto Spoto b

摘要

Android是一种基于Java和嵌入式操作系统的编程语言移动设备,其上层是用Android语言编写的。作为一种语言,它的特点是可以扩展的基于事件的库和声明式XML布局的图形视图的动态文件。 用Android程序的静态分析器必须考虑以下这些特征,用于正确性和精确性。

目标:我们的目标是扩展Julia静态分析器,基于抽象解释,正确分析Android程序。这篇文章是对这样一个扩展的深入描述以及我们面临的困难和获得的结果。

方法:我们已经扩展了Julia分析器的类分析,这是对许多其他的核心分析,通过考虑一些Android密钥的具体功能,如潜在的存在许多条目指向一个程序和通过反射从XML图形视图的扩展。 我们还大大提高了Android程序的分析的精度。

结果:我们已经分析了Julia大部分的Android示例应用程序和一些更大的开源程序。我们已经应用了几十个静态分析,包括类播,死代码,和终止分析。Julia在Google中自动发现了错误,缺陷和低效率样品和开源应用程序。

结论:Julia是第一个针对Android程序的静态静态分析器,基于正式的基础抽象解释。我们的研究结果表明,它可以分析真正的第三方Android应用程序,输出代码的任何用户注释,在最多7分钟和标准时间类产生正式正确的结果硬件。因此,它已经准备好了第一次的产业化使用。

1. 介绍

Android在操作系统市场中的主要角色是嵌入式设备,如手机,平板电脑和电视等。它是一个上部层是用编程语言(也称为Android)编写的设备的操作系统。作为一种语言,Android是Java的一个扩展库的移动和交互式应用程序,因此是基于事件驱动进行构造的。任何Java编译器都可以编译Android应用程序,但是所产生的Java字节码必须被翻译成最终的Dalvik字节码在设备上运行。

Android应用程序的静态分析很重要,因为质量和可靠性是Android市场成功的关键,否则就会立即被潜在用户丢弃。因此Android程序员想要确保他们的程序是没有错误的,例如他们不会抛出任何意外的异常,不要挂载设备。而且Android应用程序也越来越多地部署在军事情况下,所以安全质量是最重要的。出于这样的原因,例如Klocwork [16]已经扩展了其从Java到Android的静态分析工具,获得了唯一的静态分析。

一个工具,如Klocwork是基于语法检查的。这意味着通过寻找典型的语法来识别错误通常包含错误的代码模式。使用语法检查导致非常快速和实用的分析。但是,当错误代码不遵循分析仪已知的检错模式就会失败了。对于语法工具如Julia来说情况恰恰相反,其中bugs能被智能的工具发现在什么位置,基于形式方法,能够证明程序片段不包含错误。这第二种情况更复杂并且计算复杂,但提供了保证结果的健全性:如果没有发现潜在的bug(某些类),那么类的代码中就没有错误。换句话说,语法工具虽然快速但不健全。两种方法都会发出假报警,即存在潜在的bug而实际上不是一个真正的bug。精度(即,真正的错误警告的数量)是这里的关键问题,因为假警报的数量不应该超过用户的工具所允许的最大数量。这是大多数开发者认可的静态分析工具。例如,我们可以引用Coverity [7]的网页:“通过提供业界最精确的分析解决方案和最低的假阳性率,你可以专注于真正的,有缺陷的代码而不是浪费开发周期“。因此,大多数的静态分析仪开发者的努力是朝向减少假阳性的数量去研究。在任何情况下,存在的一个公司,如Klocwork在这个市场上显示的行业认能够识到Android代码的静态分析的重要性。

目前局限于Android应用的安全验证。它执行Android应用程序的信息流分析,通过意图跟踪组件间通信潜在的非法获取安全特权通过coali-应用程序。 其基础是基于约束的分析代码和有一个健全的保证,至少对于一个限制种类的字节码。Klocwork目前不执行任何信息 Android应用程序的排序流分析。

Julia是一个基于抽象的Java字节码的静态分析器解释[6],自动确保分析应用程序不包含大量的编程bug。它应用于整个程序,过程和语义静态分析,包括分类,死代码。它带有正确性保证,因为它是存在抽象解释的情况:如果应用程序包含一个由分析器考虑的类型的错误,那么Julia就会报告,这使得分析的结果更多。虽然Java和Android是相同的语言,但有一个不同的库设置,Julia到Android的应用不是即时的,我们不得不解决许多问题之前Julia可以以正确和精确的方式来分析Android程序。也有很多相关的不同库集,其他的使用XML构建部分应用程序。在本文中,我们介绍这些问题连同我们的解决方案,并显示结果系统分析具有高度的Android程序的精度,并在第三方代码中发现错误。这篇文章没有详细描述Julia提供的静态分析在别的地方的用处,只是适应Android的分析器及其分析。特别是,我们的类分析在简单检查的核心如类播和死代码分析在[27]有介绍;我们的无效分析在[25,26]中介绍;我们的终止分析在[28]中描述。

必须说明的是,我们的Julia分析仪在声压级反思,重新定义类加载机制Java和多线程。 这并不意味着程序使用这些功能不能被分析,但只是结果可能不正确。 其实,我们工作的一个主要成就是教授Julia关于反射的具体使用是在做什么在Android中的XML布局扩展,在这种情况下(但不是用于反射的其他用途)。

我们的分析器假设在一个封闭的环境下分析例如,它假定在入口点处的变量可能绑定到每个类都与它们声明的类型兼容,可能以任何可能的方式共享或保持。同样的假设不能为依赖库,可以扩展和其行为可以通过子类化来修改。因此,对于依赖库的分析,因为我们只分析完整(封闭)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-7节描述了我们如何改进朱莉娅在Android上工作。特别是,第5节讨论,通过类分析的声控制流图,在存在XML通货膨胀。介绍实验结果在许多不平凡的Android程序从标准的谷歌分布和较大的开源项目;它显示了Julia在这些程序中发现了一些实际的错误。本文是更短的扩展版本会议论文于2011年在CADE提交[22]。关于完整的实验,相关评估没有出现在文献[22]中。此外,第4-6节提供了一个更深入的介绍,倾重于Julia,与[22]的相应部分相比。

Julia是一个商业产品(http://www.juliasoft.com)可以通过可用的web界面自由使用公司的网站,其权力受到超时限制和最大分析尺寸。 Fausto Spoto是主席该公司,他于2010年11月成立。他也是

Julia软件的主要开发人员。 Eacute;tiennePayet目前留尼旺(法国)的副教授。 他不是会员Julia Srl,但他经常与Fausto Spoto合作,特殊事项。

2、Android的静态分析中的挑战

Android程序的分析是复杂的,因为我们必须考虑Android的一些特定功能,无论是正确性还是分析精度。首先,Julia分析Java字节码,而Android应用在Dalvik字节码中。还有翻译Dalvik到Java字节码(如[24]和[8])。但在Eclipse IDE [9]中开发的Android应用程序可以al-方式以jar格式导出,即在Java字节码中。Eclipse是的标准开发环境,因此我们更喜欢从Eclipse生成jar文件。另一个问题是Julia开始分析一个程序是从它的主方法开始,而Android程序可以从很多开始事件处理程序。这也是一些基于事件的Java的问题程序,如使用actionPerformed的Swing程序事件处理程序。这对Android代码来说更有问题,其中整个程序通过事件处理程序工作通常通过反射来调用,使得它们可能实际上看起来像死代码到不理解反射的静态分析器。因此,我们必须修改Julia,以便所有人都可以开始分析这样的处理程序,将其视为潜在并发入口点。必须声明的Android事件处理程序是由单线程分隔,所以我们没有考虑困难多线程应用程序的分析问题。入口点从最坏情况假设分析,说明例如它们的参数和接收器可以属于任何类兼容与其静态类型,或可以始终为null或保持重叠数据结构。

一个更复杂的问题是通过XML文件被规范声明的用户界面,可以被Android使用。意即代码不是完全可用的字节码格式,在运行时,需要从XML布局文件翻译到实际的字节代码,然后通过Java反射使用。这个问题不能忽视,定时通过认为布局代码只包含图形方面,与静态分析无关。相反,在Android程序中,XML类如视图,菜单和首选项,一个应用程序的大多数甚至所有代码,包括它的逻辑。 此外,XML扩展代码和XML之间的链接显式应用程序代码引入强制和潜在的零点异常。因此,如果我们想让分析器正确运作就必须考虑XML扩展。

最后,真正的挑战是图书馆的规模:一般来说,Android程序使用受限制的java./和新的android./ hierarchyies。 他们的类必须一起分析程序,这很容易导致对10,000种方法的分析或者更多。

3、安卓基础

我们在这里只描述Android中有用的概念这张纸。 有关详细信息,请参见[1]。Android应用程序是用Java编写的,并且以自己的方式运行进程在自己的虚拟机内。他们没有入口点,但可以使用其他Android应用程序的部分,并可以通过调用他们的需要他们的服务事件处理程序,直接或通过操作系统。 特别地,Android应用程序包含活动(通过可视界面与用户交互的代码),服务(背景操作,没有与用户交互),内容提供商(数据容器(例如数据库)和广播接收器(对象)对广播消息做出反应)。 事件处理程序预定在没有特殊的顺序,有一些显着的例外,如Activity的生命周期。

XML清单文件注册应用程序的组件。其他XML文件描述的活动的视图通过将布局文件扩展为可视对象(视图的层次结构),是一个由Android依赖库提供的。这意味着库或用户定义的视图不是由新语句显式创建的而是通过反射而膨胀。库方法如findViewById访问膨胀的视图。 1,从Google发布的Android 2.2。当活动第一个时,onCreate事件处理程序被调用创建后,其构造函数已被隐式调用Android系统。 setContentView库方法调用布置虚拟机;其整数参数唯一标识XML布局文件。从图2中的文件的行3开始。 2,很清楚在图1的线9处标识为月球的视图属于用户定义的视图类com.example.android.lunarland-er.LunarView。在图1中的线9处的铸件1因此是正确的。 Con-stants R.layout.lunar_layout和R.id.lunar是

在编译时从XML布局文件自动生成名称和它们包含的视图标识符。用户可以调用setContentView多次和代码;他可以将任何整数表达式的值传递给它和findViewById,虽然通常的方法是通过comppiler生成的常量。这种声明性构造的对象也适用于偏好(图形应用程序选项)和菜单。

4、我们应用的静态分析集

我们应用的静态分析集我们在这里描述我们让Julia应用的主要分析Android程序。 前六个比较简单,与后两个相比。 除了方法重定义检查,即纯粹是语法的,他们都利用类分析,在提取应用程序期间形成,其计算程序的控制流图的过近似。因此,他们利用语义,整个程序和inter-关于程序的硬度信息。

这些分析不是最新的。他们是非常知名的静态分析面向对象的代码,已经由工具等执行作为Klocwork,Coverity和FindBugs,参见他们各自的homepages。新颖性是它们在一个健全的工具中的实现了Android代码。

平等检查。 Java程序员可以将对象与a进行比较指针身份检查==和与程序检查等于。 在大多数情况下,后者是优选的。但是使用==

为了有效地比较各个对象,知道身份平等对应于程序化平等。在同一类类型上使用两种类型的检查因此是潜在错误的症状。此外,使用equals或== on数组很可能是一个错误。为了防止我的类==和equals应用于,Julia使用改进[20]中定义的0-CFA类分析。

Classcast检查。不正确的播放是典型的编程错误。将通用类型引入Java已经减少了使用cast,但是程序员有时仍需要它们。不幸的是,Android实际上引入了新的情况其中需要铸造,例如在图5中的线9和11处。 茱莉亚应用其类分析以证明铸造正确。我们不得不保证Android库的类分析精确的特性,以证明这些分析的正确。

静态更新检查在构

全文共12055字,剩余内容已隐藏,支付完成后下载完整资料


资料编号:[142898],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。