如果你是一位编程新手,那么一定会为那些意外的程序错误感到苦恼。于是你只能埋头细细分析错误,浪费了大量的时间。那么,如果程序错误能自己自动改正,而不需要你去改正,这该多么好。
为什么软件开发人员不使用静态分析工具来发现漏洞?静态分析工具是帮助程序员快速发现程序错误并改正的良好工具。
软件质量变得越来越重要,同时软件也越来越依赖软件系统。有不同的方法能确保软件质量的方法,包括代码评审和严格的测试。软件缺陷会让公司付出代价,静态分析工具提供了一种分析代码的方法,无需运行代码,有助于在整个开发过程确保更高的质量软件。
静态分析工具
目前已经有执行自动静态分析的各种方法,包括应开发人员的要求,不断地在开发环境进行创作软件。静态分析工具可以允许开发人员配置类型BUG,有时甚至可以定义新的BUG模式。一些自动化的静态分析软件可以提供快速修复功能。
快速修复是针对自动产生的缺陷的建议或解决方案,应用于开发人员的代码。比如FindBugs快速修复工具以Eclipse和NetBeans集成的插件开发环境的开发环境为例,快速修复可以从命令行或作为一个单独的工具进行工作。在IDE中,FindBugs有自己的缺陷透视图。
每个BUG都有一个严重程度,表示BUG有多重要。从高到低分别代表红色,黄色和绿色。FindBugs提供了一些特定的快速修复功能。开发人员可以考虑许多情况使用静态分析工具查找代码中的缺陷。让我们举一个开发者为例进行说明,Susie。
Susie是一家小公司的软件开发人员。她想在保持质量的同时遵守公司的标准代码。她需要一种在IDE中检查代码的方法将它提交到通用代码存储库,而不用担心任何她无法控制的外部依赖。Susie最好的办法是安装一个静态分析工具。她决定安装FindBugs,因为这可以让她在运行程序之前就发现代码错误,你会觉得这很有效率。
在程序开发的早期,静态分析工具使用定义良好的编程规则来查找缺陷,在BUG刚出现时便得到修复例如,有一些静态分析工具可以提醒开发人员哪些同步问题可能导致不安全的线程交互。开发人员已经能够消除许多以前被忽略的缺陷,几乎所有大公司都使用静态分析工具了。
静态分析工具缺点
尽管使用静态分析工具进行查找会发现程序很多好处错误,但这些工具的一致使用不是很频繁的。使用静态分析工具处理接口也成为了程序员的一种负担,找到警告并不容易。检查代码而不使用静态分析工具需要做更多的工作,很多人宁愿这样做以避免使用该工具所带来的时间和混乱。不过已经有研究来探讨改善静太分析工具。
所以,尽管静态分析工具可以快速发现BUG,但是很少有人愿意用。
为什么开发者没有广泛的使用静态分析工具?研究人员进行了一项涉及20名用户的研究软件开发人员的研究,他们都有使用过静态分析工具的经验。研究结果证实了开发人员对当前的不满意在一定程度上与团队工作有关,静态分析工具适合个人使用,但对于一个团队便不合适了。增强团队开发的静态分析工具,改进工具集成进入开发人员的流程,让静态分析工具具有直观的缺陷表示,详细解释自动修复的缺陷,包括简单和有用的配置工具的选项,这都能提升静态分析工具的友好性。
不过,除了静态分析工具,利用人工智能的深度学习也能自助识别并修复程序代码的BUG。目前通过深度学习可以修复常见的C语言错误。
端到端,DeepFix
编译器会检测到代码错误,但是它们的错误信息通常是不准确的。有研究人员提出了端到端的解决方案,叫做DeepFix,这是个利用深度学习技术的修复工具,可以修复多个代码错误而不依赖任何定位或修复它们的外部工具。在DeepFix的中心有一个多层的序列,序列神经 络被被训练来预测错误的程序位置以及所需的正确语句。在一套学生写的错误的C程序任务,DeepFix可以修复高达30%的错误。
让我们来详细解释DeepFix。
大部分程序修复技术集中在程序的逻辑错误上,一般都使用程序的规范(如测试组合或断言)。因为他们的重点是他们假设是关于修复个别程序中的逻辑错误则程序编译成功。这就留下了一个大而频繁的类错误,这些错误包括缺少范围分隔符(如右括 ),添加无关符 ,使用不兼容的操作符或丢失变量声明,等等。
这样的错误是由程序员造成的,一般是由缺乏经验或缺乏对细节的关注导致编译错误。不仅是初学者,有经验的开发人员也会犯这样的错误。我们称之为常见编程错误。这些都类似于自然语言中的语法错误。DeepFix便会对常见的编程错误进行深度修复学习。因为程序相互之间的依赖性,每段代码都是上下关联的,修复一个错误可能需要对整个程序进行改动,这使得DeepFix修复整个程序具有特别大的挑战性。
要使修复正确,修理工具必须产生有关的整个程序精确的定位。在端到端的解决方案中,DeepFix不使用任何外部工具而本地化得修复错误。DeepFix的核心是一个多层的序列神经 络,包括一个编码器递归神经 络(RNN),处理输入和解码器的RNN。
DeepFix训练预测错误的程序位置并改成正确的语句。DeepFix迭代地调用它来修复程序中一个接一个地出现多个错误。例如,DeepFix正确预测第13行有错误并生成一个序列“返回0”,并在后面插入右大括 。
错误消息既神秘又具有误导性,它不将错误定位到第13行,相反,它错误地暗示了程序文本中的第18行。常见的编程错误不是特定于任何特定的编程任务,而深度修复可以用于任何看不见的编程任务的解决方案。不像深度修复,神经 络用于上述方法本身不能本地化错误。一般的编译器进行枚举搜索本地化错误,而DeepFix使用一个基于序列的捕获模型依赖关系。
研究人员将DeepFix应用于由学生编写的C程序中的93个不同的程序设计任务课程,并且DeepFix解决了常见编程错误的问题并提供基于深度 络的端到端解决方案,还可以迭代地修复同一个程序中的多个错误。
神经 络结构
DeepFix的关键部分是神经 络结构。神经 络结构提出了一种建立在序列到序列模型上的机制。编码器和解码器的RNN都由N个栈组成门控制复发单位(GRUs)。编码器将输入序列中的每个标记映射到一个实向量标签。
DeepFix技术与编程语言无关,并且也可以推广到其它编程语言。未来人们会应用深度学习来解决更多的问题,解决具有挑战性的编程错误。同时DeepFix也在开发有效的神经 络架构处理时间序列。
修复工具并不完美
虽然上面介绍了两种代码自动修复工具,但是目前,还没有任何一种完全智能的修复工具。
随着各种用于智能设备、无人机和其它 络物理或自主系统的物联 (IoT)软件的出现,对在线程序修复的需求越来越大,尤其是对能源消耗等非功能性程序的修复。考虑一个用于灾难恢复的无人机,例如洪水或火灾控制。无人机软件可能会遇到意想不到的或危险的输入,只是因为它面临着一个无法预见的物理环境,这可能会耗尽设备的电池。
无人机软件需要在线自我修复。针对非功能性问题的自动修复可以提供这种自我修复能力。我们达到了吗?当前的非功能特性修复技术已经显示出它们在改进实际软件方面的有效性。考虑两个性能修复工具,首先,MemoizeIt tool31执行应用程序级缓存的代码,这样可以降低程序的速度,避免不必要的重复计算。其次,Caramel tool19为广泛使用的Java和C/ c++程序(如Lucene、Chromium和MySQL)中总共150个以前未知的性能问题提供了补丁。虽然这些例子是令人鼓舞的,但如何应用非功能性修复来实现全自动自修复的问题仍然存在。
自动程序修复仍然是一种诱人但可实现的技术
自动程序修复仍然是一种诱人但可实现的技术,可以提高程序质量,同时提高程序员的开发经验。从技术上讲,自动修复涉及到定义、导航和确定补丁空间的优先级方面的挑战。该领域受益于过去在搜索空间定义和软件测试导航方面的经验教训,具体体现在测试选择和优先级确定方面的大量文献。
GenProg tool37只是基因搜索的一个例子,基因搜索在测试中很有用,但也有可能被用于修复。与此同时,自动修复也带来了新的问题,因为它可能会生成与给定测试不匹配的补丁。这是测试不完全正确性规范的表现。因此,有必要通过推断规格来指导修复,可能是通过程序分析。如何将修复问题视为推断修复,这展示了这种基于约束的技术的可伸缩性。
随着深度学习技术的进步,完全有可能开发出一种完全智能的程序修复工具,让我们拭目以待。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!