随着现代军事系统越来越依赖软件,正在采用新技术来降低成本并增加任务成功的机会。因此,静态分析基于其在运行时之前的深度分析功能,在软件开发社区中越来越受欢迎。
这些静态分析工具(增强但不能取代传统的测试和调试方法)可在集成发生之前很久就发现集成错误,从而消除了代价高昂的后期集成问题。
随着军事装备和车辆的日益现代化,它们在技术上也不可避免地变得更加复杂。在许多情况下,这些机器代表了硬件和软件的微妙融合,两者必须完美地交互。由于这些机器的软件组件必须在现场尽可能可靠地工作,因此使用多种技术组合执行广泛的调试和测试非常重要,以便在缺陷导致长时间延迟或超限之前消除缺陷。这通常是不切实际的,因为在代码实际实现到最终运行代码的设备之前,通常没有办法可靠地测试代码。由于软件很少在第一次执行时完美运行,因此使用传统的开发方法和工具返回并修复错误会阻碍生产力,并将宝贵的资源和人员从需要完成的其他项目中转移出来。
例如,波音787梦想客机由于硬件和软件缺陷而延误了两年。这些问题往往是相互交织的。就梦想客机而言,一个特殊的延迟是由于控制制动系统的软件存在缺陷。重要的是要注意,传统的测试并没有在它真正成为一个问题之前发现这个缺陷,并在开发过程中造成代价高昂的挫折和其他并发症。静态分析等现代技术可以增加内存损坏和释放后用户等问题被更快地发现的可能性,并有助于实现DO-178B的设计保证级别(DAL)。与传统的V模型相比,静态分析是一种更高效、更具成本效益的途径,与传统的测试和调试方法协同工作,以缓解集成问题和费用。
静态分析和开发过程
软件开发往往遵循特定的生命周期。一个例子是航空航天工程中常用的V模型。V 模型代表了一种整体开发方法,它试图在一段时间内协调项目定义和测试过程。该模型从建立项目的范围开始,包括其操作概念、要求和体系结构,以及其设计的具体细节。
这个过程在更高层次上开始非常抽象,并在设计过程中逐渐完善和详细。随着设计的实现,在开发周期的后期修复问题的成本会更高。一旦项目基本完成并正在测试中,回去对其基本方面的维修就变得非常昂贵。
最终,许多软件问题是由低效的开发模型和不精确的调试过程引起的,然后恶化。通过使用静态分析等现代技术尽早消除软件缺陷,可以提高开发效率和成本效益。
具体来说,静态分析是一种在不运行软件的情况下查找软件缺陷的技术。它的工作原理是检查产品源代码,从单个功能开始,一直到模块,最后是整个程序。静态分析可以发现许多不同类型的缺陷,包括C / C++程序中的内存错误。例如,静态分析可以检测以下简单代码片段中的错误:
int a[10];
for(int i = 0; i < 10; i++); {
a[i] = 0;
}
有时人类很难看到软件代码中的问题,因为他们看到的是他们想要看到的东西,而不是实际存在的东西。当编译器将此代码转换为可执行程序时,编译器以机械和精确的方式读取源代码,忽略缩进和间距等人为提示。编译器将按以下方式读取示例:
int a[10];
for(int i = 0; i < 10; i++)
;
{
a[i] = 0;
}
如图所示重新格式化代码后,导致程序具有完全不同的含义的额外“;”字符突然变得更加明显。如果此错误在最终程序中仍未纠正,则当 i = 10 时,数组访问 a[i] 将仅执行一次。结果是分配给数组末尾的内存位置,这可能会导致程序崩溃。
静态分析像编译器一样机械而精确地检查代码。但是,静态分析器不会盲目地将代码转换为可执行程序,而是查找代码功能与开发人员最初预期的工作方式不同的路径。静态分析可以通过模式匹配等简单技术或过程间数据流分析和布尔满足性等高级技术来完成。无论使用何种技术,静态分析都是定制的,用于查找人类开发人员可能忽略或出错的情况。这为全面的逐行代码审计提供了一种更有效的替代方案,这对于大型软件系统来说并不具有成本效益。
将静态分析和传统调试相结合
与功能测试等传统方法相比,静态分析呈现出一组不同的权衡。传统测试只能检测实际测试的代码中的错误,而静态分析可以在没有任何测试的情况下发现所有代码中的缺陷。有时,通过测试发现的错误很难重现并查明源代码中的特定问题。静态分析可以以可重复、可预测的方式发现问题,并且始终指向代码中的特定位置。另一方面,传统测试可以发现静态分析无法发现的功能错误,因为静态分析不会尝试将程序的行为与预期结果进行比较。静态分析在分析深层程序属性时也会失去精度,因此可能会遗漏一些缺陷。因此,静态分析旨在增强传统方法的有效性,而不是直接取代它们。
由于静态分析适用于现有的工具集和编译器,因此无需更改当前的开发实践。静态分析可以在编写第一行代码后立即开始的项目期间频繁应用(即使在夜间构建上)。从本质上讲,如果项目的代码库可以成功编译,则可以使用静态分析来调试它,并在项目交付给质量保证人员进行最终测试之前很久就消除问题。
静态分析的集成优势
静态分析在面向团队的环境中也运行良好。开发人员可以使用静态分析来检查彼此的贡献是否一致,并检查由不同团队成员编写的代码引起的冲突。这可以适用于单个项目,甚至可以扩展到需要多个项目之间集成以创建复杂系统的更大场景。
静态分析不仅可以找到简单的代码缺陷;如前所述,它能够在不同组件集成在一起之前分析它们之间的相互作用。在软件开发的V模型中,测试和验证从单个组件开始。当这些组件满足其低级规格时,它们将集成在一起,以便根据系统要求进行更高级别的测试。如果严格按照此理想执行软件集成,则集成阶段会带来很高的风险,因为各个组件将是第一次交互。这些交互可能会暴露原始项目规范的问题,特别是关于如何将系统需求和体系结构转换为详细的设计要求和源代码。静态分析工具可以在编写软件组件后立即分析它们之间的交互,在实现阶段捕获其中一些昂贵的集成问题。这些工具通过跨过程边界分析代码来查找应用程序编程接口 (API) 使用中的问题,即使过程位于不同的软件组件中,也可以实现此目的。
通过静态分析最大限度地提高效率
软件正被用于以曾经不可能的方式改进智能炸弹和无人驾驶无人机等军事系统。静态分析工具,例如Coverity提供的分析工具,也是这一趋势的一部分。静态分析工具与传统的测试和调试方法结合使用时,可在运行时之前有效地分析软件并检测代码错误,从而最大限度地降低风险和成本,同时最大限度地提高软件开发投资的价值。
审核编辑:郭婷
-
编译器
+关注
关注
1文章
1618浏览量
49060 -
无人机
+关注
关注
228文章
10358浏览量
179715
发布评论请先 登录
相关推荐
评论