静态代码分析 (SCA) 是一种在不运行程序的情况下检查计算机源代码中是否存在错误、脆弱性和次优代码的方法。它使用自动化工具扫描代码并实时执行高级分析。
获取有关最重要且最有趣的 AI 新闻的精选洞察分析。订阅我们的每周 Think 时事通讯。请参阅 IBM 隐私声明。
静态代码分析涉及三个主要阶段。
分析器读取源代码并将其分解为多个令牌。这些数据会被输入解析器,根据特定编程语言的语法规则进行评估,并将它们重组为层级抽象语法树 (AST)。AST 以机器可读的格式映射软件的结构。
分析器构建控制流图 (CFG) 来映射执行路径,并结合数据流分析来跟踪变量从初始化到使用的值是如何变化的。在这一阶段,分析器可能会发现诸如死代码(永远无法执行的代码)之类的错误。
该工具使用 AST 和流模型,根据编码指南和启发式方法检查代码。这些检查包括从简单的命名约定到更复杂的安全检查(如污点分析),该分析跟踪可能导致 SQL 注入的受污染用户输入。
在计算发展的早期阶段,代码执行的成本非常高昂,开发人员不能把计算资源浪费在调试上。验证过程完全由人类智能驱动,需要缓慢且由人工进行的评论。
1978 年 Stephen C. Johnson 在贝尔实验室创建 Lint,标志着现代静态代码分析的开端。Lint 专为 Unix 操作系统开发,旨在编译前扫描源代码并标记可疑结构。
Lint 可以在不改变程序逻辑的情况下准确删除有问题的代码,从而节省宝贵的算力。Johnson 以干衣机中衣物收集器捕获的纤维团屑并将其命名为 Lint,因为他的工具去除了不需要的问题代码 (lint),却未改变逻辑(衣物的结构)。
随着互联网在二十世纪九十年代和二十一世纪初期的发展,降低安全漏洞的需求也随之增加。为了满足这一需求,出现了新的工具,以及更复杂的分析形式,这些分析将代码编译成数学模型,以跟踪变量的移动。出现了诸如静态应用程序安全测试 (SAST) 之类的新框架来应对这些威胁,而动态应用程序安全测试 (DAST) 等方法则支持运行时评估。
虽然在数学上精确,但这些技术由于理解上下文的能力有限,因此存在较高的假阳性率。二十一世纪二十年代机器学习和大型语言模型 (LLM) 的兴起开启了代码分析的新时代,其中可以用数十亿行代码来训练模型。这种训练使他们能够推断开发人员意图和语义上下文。
传统上,静态代码分析是发布前运行的把关过程,但如今,这种分析贯穿整个软件开发生命周期( SDLC )。这种“左移”理念是指将测试“向左”移动,使其更接近代码的创建阶段。
如今,SonarQube、ESLint 和 GitHub 进阶版 Security 代码分析工具已成为开发人员工作流中不可或缺的一部分。它们在集成开发环境 (IDE) 中运行,并在开发人员键入时实时标记错误。它们还充当持续整合和持续部署或 CI/CD 管道中的自动检查点。
由机器学习驱动的现代编码助手实现了去中心化的代码分析,这种分析速度快且几乎不可见,使开发者能够及早发现错误,实时提升 代码质量 。例如,IBM 有一个“评论”工作流,该工作流在一个单独的面板中运行,并自动查找代码异味并标记违反编码标准的行为,然后用户可以将其关闭或让 IBM 自动解决这些问题。
也可以通过策略提示主动进行分析。例如,开发人员与其要求编码助手“查找错误”,不如要求它根据具体目标审查代码库。对于架构审查,可以要求它审查目录组织、入口点、组件关系和整个技术堆栈,所有这些都会生成详细的文档。分析数据库设计的提示可以确定现代化目标。提示可以审查数据库设计、迁移分析,并对技术债务进行评论,并就如何战略性地修复问题提出建议。
借助您的 AI 合作伙伴 IBM® Bob,加速软件交付,实现安全的意图感知型开发。
利用企业级工具更快地开发、部署和管理 AI 应用程序。
用智能 AI 现代化重新构想旧版系统。