静态分析工具可以帮助找到并发性和其他缺陷,以减少遗留的延迟。
从基于软件的旧系统迁移到新技术时,能够重用尽可能多的代码非常重要。即使这些代码已经过彻底的测试,并且在旧系统中的实践中被证明是可靠的,它仍然可能包含潜在的错误。这些错误可能从未在旧系统中触发,因为该系统非常特定的属性,例如用于编译代码的工具链、处理器体系结构或主机操作系统。当移植到这些属性不同的新系统时,潜在缺陷可能表现为有害错误。但好消息是,先进的静态分析工具可以清除这些潜在的缺陷,以帮助应对挑战。
更新系统,揭示编码缺陷
迁移遗留系统最重要的动机之一是利用自原始系统首次部署以来硬件技术的进步。由于采用了更新更快的处理器,最常见的好处可能是性能提高。从代码的角度来看,这也是一个最重要的变化。新处理器可以具有不同的位宽或字节序,并且可用内核的数量可以不同。在从旧平台移植到下一个平台的代码期间,大部分重新编码工作将用于使代码适应这些差异。
编译器、工具链和潜在错误
与实现新处理器相比,还有许多其他不太明显的差异,这些细微差别很容易被忽视。以用于编译代码的工具链为例。从表面上看,这应该不会有太大区别。毕竟,如果代码是编写为符合 ANSI C 标准,并且如果编译器声称支持 ANSI C,那么当由任一编译器编译时,代码肯定会具有相同的语义吗?不幸的是不是。C 和 C++ 标准充斥着“编译器依赖”的子句,这意味着该标准并不确切规定如何编译某些结构,选择取决于编译器编写者。其中许多对于程序员来说是显而易见和众所周知的,例如计算操作数的顺序,但其他的则非常微妙。潜在错误在旧系统上可能是无害的,因为编译器选择以特定方式编译它,但在新系统上是危险的,因为新编译器会做出不同的选择。
当然,编译器也是程序,它们本身并非没有缺陷。最近一项针对 C 编译器的研究发现,他们测试的每个编译器都有代码生成缺陷[1]。易失性关键字的处理在嵌入式安全关键型软件中至关重要,因为它经常用于读取传感器数据,特别容易出现编译器错误,从而导致传感器值的更改被静默忽略。程序的正确运行甚至可能依赖于这些缺陷。
另一个危险区域:标准库
另一个可能导致潜在缺陷变得危险的细微软件迁移差异涉及与操作系统接口的标准库。人们可能希望这样的库在各个平台上保持一致,但这种情况很少见。最显着的区别是在错误处理方面。新平台可能具有与旧平台完全不同的故障模式,可能需要更改代码才能处理这些差异。更糟糕的是,根据最近的一项研究,错误案例的记录似乎非常糟糕[2]。
静态分析胜出,补充传统测试
显然,任何遗留迁移项目都必须包括大量时间来测试软件的新版本。但是,测试结果仅与测试输入一样好。如果测试用例未能执行发生错误的路径,则该缺陷可能无法检测到。生成新的测试用例也很昂贵。因此,清除这些潜在缺陷的明智策略是使用高级静态分析工具作为遗留转换工作的一部分。此类工具能够发现本文所述的缺陷,包括那些依赖于平台微妙之处的缺陷。他们特别擅长发现并发缺陷,例如使用传统测试方法极难发现的数据争用。他们还擅长查找代码实例,这些代码虽然不是绝对错误的,但与错误高度相关,或者在移植到不同环境时特别危险。
审核编辑:郭婷
-
处理器
+关注
关注
68文章
19094浏览量
228787 -
编译器
+关注
关注
1文章
1617浏览量
49012
发布评论请先 登录
相关推荐
评论