如果你问开发团队,他们的主要目标是什么,三个最常见的答案可能包括:
- 编写无错误的代码。
- 符合设计规范。
- 规避安全问题。
那么,团队如何审查代码以确保这三个主要目标都得到满足?
答案很简单,是代码分析。但它应该是静态代码分析?还是动态代码分析?或者两者结合?
不妨看看静态代码分析和动态代码分析如何在开发中发挥重要作用,以及它们的差异如何有助于规范代码。
静态代码分析和动态代码分析有何不同?
静态代码分析检查代码,以识别逻辑和技术中的问题。动态代码分析则运行代码和检查结果,这还需要测试代码可能存在的执行路径。
即使采用最基本的方式,当开发团队测试代码时,他们是在执行动态分析。而当程序员审查代码时,则是在执行静态分析。无论使用哪种工具,开发人员和程序员都在执行分析,最终有助于创建更好的代码。
静态代码和动态代码本身都不是理想的选择,这意味着团队应优化两者。开发团队不能将静态代码分析和动态代码分析视为非此即彼的关系,而是应将它们视为互补和共生的关系。
代码审查类似静态分析
如果由于某种原因,团队决定略过静态代码分析,那其实意味着团队计划不审查代码。代码审查和静态代码分析好比是相关的术语。代码审查有助于发现代码问题,无需进行费时又费钱的动态测试。在代码审查环境下进行的静态代码分析是开发和维护优秀软件的第一步,也是最重要的一步。
大多数静态代码分析是使用旨在评估代码,查找错误或不推荐的技术和实践的工具完成的。将静态代码分析视为代码审查要素的组织可能会先进行正式的代码审查,然后运用静态代码分析工具,最后借助选择的代码审查流程审查结果。
如果机构决定先与程序员和导师一起审查代码,它们可能会考虑先使用静态代码分析。这种方法可能会揪出至少 85% 的代码错误,为专家省下识别错误的宝贵时间。
静态代码分析和审查特别适合快速开发和 GitOps 环境:在这种环境下,常常对单个组件进行更改。比如说,如果软件设计适当地隔离了组件行为,静态分析可以揪出大部分代码错误。
为什么进行动态分析呢?
简而言之,静态分析无法揪出每个代码缺陷。
解决复杂的多组件应用程序中的问题时,静态分析尤其受到限制。当您想要衡量性能或测试用于扩展及(或)负载均衡的策略时,它几乎失去价值。面对这些限制,动态代码分析就有了用武之地。
协调动态分析和静态分析
正如开发团队已经经常使用静态代码分析——即使这种分析不是正式规定或管理的,他们也使用动态代码分析。常规软件测试和运行软件以验证修正版或验证初始实现机制是动态代码分析的几种形式。
因此,这不是静态代码分析与动态代码分析两者择其一的问题。团队可能已经使用了两者。问题变成了如何有效地使用两者。
静态代码分析最好与代码审查结合使用。动态代码分析适用于某种形式的自动化测试和测试数据生成。
团队应先将动态代码分析的重点放在静态分析可能无效的方面,比如组件性能、应用程序性能、应用程序逻辑、安全验证和跨组件边界。比如说, Redgate SQL Data Generator 和DTM Data Generator (仅举几例)等自动化测试数据生成工具可模拟应用程序在满负荷下的操作、验证所有逻辑路径,并测试这些点是否存在安全漏洞。一些机构可能已经在使用这些工具,但重要的是,它们可以用来测试静态分析极有可能遗漏的特定方面。
使用唾手可得的工具和实践很容易实现性能和负载测试的自动化。面对任何形式的生成数据自动化测试,设置逻辑和安全验证比较困难。团队需要强调测试设计,并认真选择具有特定字段值约束的数据生成工具,以运行识别潜在问题的测试。在安全验证方面,团队应将测试数据范围值扩大到正常操作之外,以确保它们不会带来潜在的问题。
静态代码分析与动态代码分析之争表明了许多注重单个步骤而不是整个过程的开发策略存在缺陷。静态代码分析和动态代码分析都扮演重要的角色,它们都是整体的开发和部署流程的一部分。少了任何一方,另一方都不可能独立完成。
原文标题:Static and dynamic code analysis: Complementary techniques,作者:Tom Nolle