自打孔卡片的全盛时期以来,计算机编程已经取得了长足的进步。程序员通过在纸卡上打孔、反复检查其正确性并希望在他们最终执行程序时能够正常工作来手动编写任务的日子已经一去不复返了。
如今,开发人员在将一行代码输入代码编辑器后就可以获得有关代码正确性的反馈——由于静态代码分析领域的创新,这与穿孔卡片开发过程相去甚远。
静态代码分析可以在软件开发过程的早期识别和预防问题,但并非没有消耗资源的风险。虽然静态代码分析可以成为提高软件质量和可靠性的宝贵工具,但您可以通过执行测试影响分析和添加预测测试选择来增加价值。
静态代码分析意味着在不执行源代码的情况下分析问题的源代码。这与动态代码测试相反,动态代码测试启动可执行文件并验证正确的行为。
静态分析器使用算法和规则集来识别潜在问题,根据严重性和影响对其进行分类,并将问题传递给开发人员以进行分类和解决。
继续阅读以了解有关不同类型静态分析的更多信息,以及如何通过分层预测测试选择来提高其有效性。
静态代码分析技术用于在部署代码之前识别代码中的潜在问题,允许开发人员进行更改并提高软件质量。三种技术包括语法分析、数据和控制流分析以及安全分析。
语法分析涉及检查代码是否存在语法错误和编码标准违规,例如缺少括号、无效变量名和不正确的缩进。大多数现代 IDE 都内置了语法分析。例如,Visual Studio 和 Visual Studio Code 在 Intellisense 功能中内置了代码分析。在下面的屏幕截图中,Visual Studio 2022 甚至在代码编译之前就出现了缺少分号的 C# 语法错误。
语法分析可以帮助开发人员在点击“运行”按钮之前发现错误。
此技术涉及通过代码跟踪数据流,以便识别潜在问题,例如未初始化的变量、空指针和数据竞争条件。控制流分析类似,有助于识别无限循环和无法访问的代码等错误。许多现代编译器都内置了数据流分析和控制流分析。它们将任何发现显示为编译时警告或错误。
例如,C 语言家族的 Clang 工具集会在编译期间自动执行流分析。对于未编译的语言,例如 Python,您可以手动使用CodeQL等数据和控制流分析工具。
安全静态分析涉及检查代码是否存在潜在的安全漏洞,例如缓冲区溢出、跨站点脚本和注入攻击。他们还可以扫描您的第 3 方依赖项以查找具有已知漏洞的软件包,并检测签入您的源代码的凭据。
静态应用程序安全测试 (SAST) 工具包括:
斯尼克代码
微软信用扫描
示例:使用 SemGrep 进行静态应用程序安全测试
SemGrep 是一款流行的免费应用程序安全静态分析工具。在包含不安全代码的项目(如OWASP Juice Shop)上运行 SemGrep 的安全分析器,会在代码中发现数十个安全漏洞。
虽然静态代码分析可以帮助团队及早发现问题,但它并不是一种完美的方法,可能会出现误报、漏报,并且受到工具集的限制。
如果您问任何开发人员他们不喜欢静态分析工具的哪些方面,您会一遍又一遍地听到一个答案:误报。
静态分析器使用启发式方法和规则集来确定一行代码中的发现。但是,它们并不完美,而且经常会出现实际未在上下文中发布的结果。
对于下面这行代码示例:
// Set the password policy so that user passwords expire after 365 days. passwordExpiry = 365;
一个简单的安全静态分析器会看到字符串“password”,并将其标记为源代码中的凭据。经过检查,这显然不是秘密,不需要更改代码。它需要额外的开发时间来调查此问题并将其标记为误报,这可能令人沮丧。
软件代码可能很复杂,静态分析器可能会错过情况的细微差别。因此,您不能依赖静态分析器来找到您编写的 100% 的错误。
您的云环境有两个几乎相同的服务器配置文件: serverprod.config
(生产环境)和servertest.config.dev
(测试环境)。
静态分析器被配置为扫描文件扩展名为.config
文件,并在serverprod.config
中正确发现问题,但它遗漏了servertest.config.dev
文件中的相同问题,因为它与其文件名模式不匹配。
没有一个静态分析工具可以完成这一切。许多专用于不同的环境、文件类型和扫描类型。一个组织可能需要一个用于安全扫描的工具,一个用于 Typescript 前端的不同工具,第三个用于扫描 Golang 后端的工具,以及另一个用于服务器配置 Terraform 文件的静态分析器。每个工具都可以提供价值,但设置和维护所有这些工具可能很繁重。
以下是一些用于静态代码分析的顶级工具:
SonarQube :一种流行的开源静态代码分析工具,支持广泛的编程语言并与各种构建和部署工具集成。
Checkstyle :一种开源静态代码分析工具,用于检查 Java 代码中的编码风格和约定违规情况。
FindBugs :一种开源静态代码分析工具,可识别 Java 代码中的潜在问题,包括性能问题、安全漏洞和编码标准违规。
PMD :一种开源静态代码分析工具,用于检查各种编程语言(包括 Java、C++ 和 Python)中的问题。
Veracode :一种商业静态代码分析工具,提供一系列用于识别和解决软件安全漏洞的功能。
Coverity :一种商业静态代码分析工具,专注于识别和预防代码中的安全缺陷。
ESLint :一个开源项目,用于帮助查找和修复 JavaScript 代码中的问题。如果您使用的是 TypeScript,请查看 typescript-eslint 变体。
这些工具提供了一系列功能,支持不同的编程语言,并拥有不同类型的软件许可证。在选择静态代码分析工具时,重要的是要考虑许可以及组织的特定需求和要求。
下面是一个使用 ESLint 进行 JavaScript 静态代码分析的简单示例:
这行代码有两个 ESLint 很快发现的问题:
通过静态代码分析识别和解决这些问题,组织可以提高其软件的质量和可靠性。想亲自尝试 ESLint 吗?您可以在线使用ESLint Playground 。
预测测试选择是一种使用 机器学习来分析过去的测试结果并预测将来哪些测试可能会失败的技术。这可以与静态代码分析结合使用,以提高测试过程的效率和有效性。
静态分析只是软件质量策略的一个方面。
大多数组织使用静态分析来增强其功能性端到端软件测试。静态分析测试只是可能在 CI/CD 管道中运行的测试类型之一。
预测测试选择可以帮助静态代码分析的一种方法是优先测试最有可能包含问题的代码。通过分析过去的测试结果并识别与失败相关的模式,预测测试选择可以帮助将测试工作集中在代码中最重要或最有问题的区域。这有助于确保尽快识别和解决最关键的问题,同时还可以减少在不必要的测试上花费的时间和资源。
总体而言,通过将预测测试选择与静态代码分析相结合,组织可以提高其测试过程的效率和有效性,并确保其软件的质量和可靠性。
静态分析是组织武器库中保持代码质量的重要工具。它可以减少代码缺陷并提高可维护性,但也可能充斥着误报,并且可能需要多种工具才能获得组织所需的覆盖范围。
即使存在这些问题,静态分析也是任何组织交付高质量代码的一个重要方面。
使用预测测试选择运行更快、更智能的静态代码分析**。**它与您的 CI 无缝集成,无论测试类型、提交频率或分支计数如何。
预测测试选择可以将空闲时间减少 70%。通过可扩展的智能测试为您的开发人员提供出色的静态分析体验。