
什么是静态分析?
什么是静态分析?
静态分析是在不执行应用程序的情况下自动分析源代码。
当在程序执行期间进行分析时,它被称为动态分析。
静态分析通常用于检测:
- 安全漏洞。
- 性能问题。
- 不遵守标准。
- 使用过时的编程结构。
静态分析工具是如何工作的?
所有静态分析工具的基本概念是搜索源代码以识别具有某种警告或相关信息的特定编码模式。
这可能就像 “JUnit 5 测试类不需要'公开'” 一样简单。或者一些难以识别的东西,例如 “在 SQL 执行语句中使用了不可信的字符串输入”。
静态分析工具实现此功能的方式各不相同。
- 用于创建抽象语法树(AST)的源代码解析技术,
- 文本正则表达式匹配,
- 以上各项的组合。
文本上的正则表达式匹配非常灵活,易于编写匹配规则,但通常会导致大量误报,并且匹配规则对周围的代码上下文一无所知。
AST matching 将源代码视为程序代码,而不仅仅是充满文本的文件,这允许进行更具体的上下文匹配,并且可以减少针对代码报告的误报数量。
持续集成中的静态分析
静态分析通常在持续集成 (CI) 过程中执行,以生成合规性问题报告,可以对其进行审查,从而客观地了解一段时间内的代码库。
有些人将静态分析工具配置为仅测量代码的特定部分,并且仅报告一部分规则,从而使用静态分析作为其代码质量的客观衡量标准。
客观性是由所使用的规则提供的,因为这些规则对代码的评估不会随着时间的推移而变化。显然,所使用的规则及其配置的组合是一个主观的决定,不同的团队选择在不同的时间使用不同的规则。
在 CI 中执行静态分析很有用,但可能会延迟向程序员提供反馈。程序员在编码时不会收到反馈,他们稍后通过静态分析工具运行代码时会收到反馈。在 CI 中运行静态分析的另一个副作用是结果更容易被忽视。
为了帮助团队更加关注静态分析的结果,通常可以在构建过程中配置阈值指标,使其在超过该指标(例如触发了许多规则)时生成失败。
IDE 中的静态分析
为了更快地接收反馈,有许多 IDE 插件可以根据需要在 IDE 中运行静态分析规则,或者在代码更改时定期运行静态分析规则。
然后,当程序员编写代码时,可以在 IDE 中看到违反规则的情况,为了使规则更难忽视,通常可以将违规行为配置为在编辑器中呈现为带下划线的代码。
我个人认为这是改进编码的有用方法,尤其是在使用静态分析工具涵盖的新库时。尽管它可能会 “嘈杂”,带有误报或您不感兴趣的规则。但是,通过采取额外步骤将静态分析工具配置为忽略某些规则,可以解决这个问题。
根据静态分析规则修复代码
在大多数静态分析工具中,规则的修复留给了程序员,因此他们必须了解违反规则的原因以及如何修复规则。
很少有静态分析工具也包含修复违规行为的功能,因为修复通常取决于团队和所使用的技术以及他们商定的编码风格。
默认规则
当静态分析工具附带默认规则时,可能会对规则的质量产生错误的信心,人们很容易相信它们涵盖了程序员可能遇到的所有问题以及该规则应适用的所有情况。有时,应适用规则的情况可能很微妙,可能不容易被发现。
希望通过使用静态分析工具,更详细地研究规则和违规行为,程序员能够培养在特定领域中发现和避免问题的技能。
当域需要上下文规则时,静态分析工具可能没有任何与您的域或库相匹配的规则,此外,这些工具通常很难配置和扩展。
烦恼
这些 “烦恼” 都不是不可克服的:
- 假阳性
- 缺乏修复
- 忽略规则的配置
- 添加特定于上下文的规则
但是,它们通常被用作一开始就避免使用静态分析工具的借口,这很遗憾,因为使用静态分析可能非常有用,可以:
- 向初级开发人员重点介绍更好的方法
- 快速获得有关明显的编码违规行为的反馈
- 找出程序员以前从未遇到过的模糊问题
- 强调程序员采用了良好的编码方法(未报告违规行为时)
基于 IDE 的静态分析工具
作为项目的个人贡献者,我喜欢使用在 IDE 中运行的静态分析工具,这样我就能快速收到有关代码的反馈。
这补充了项目可能具有的任何拉取请求审查流程和CI集成。
我会尝试找出能给我带来优势的工具,并改善我的个人工作流程。
当工具在 IDE 中运行时,由于它们往往使用相同的基本 GUI 和配置方法,因此交替查看它们可能很诱人。
这些工具可能具有重叠的功能或规则集,但是为了获得最大的优势,我安装了多个工具以利用它们的优势。
下面列出了我在编码时积极使用的静态分析 IDE 工具:
- 内置的 IntelliJ 检查-常见的编码模式
- SpotBugs-常见错误
- SonarLint-常见使用模式
- CheckStyle-常见的样式模式
- 来自 Secure Code Warrior 的老师-创建自定义规则
我之所以使用它们,是因为它们可以很好地协同工作,相互补充和补充。
IntelliJ 检查
如果你使用IntelliJ,那么你已经在使用他们的检查了。
这些是在 IDE 中标记的静态分析规则。其中一些还具有QuickFix选项,可以重写代码以解决问题。
这些规则可以开启和关闭,也可以选择用于在 IDE 中突出显示该错误的错误级别。

有很多不错的 IntelliJ 检查项目。我知道这是因为我在写这篇文章时通读了它们。我使用IntelliJ检查作为默认值,但尚未对其进行配置,但是要从检查中获得全部价值,您应该通读它们,确定与您的编码风格相关的内容,并配置警告级别,以便您在代码中注意到它们。
IntelliJ 检查的好处在于,它们是在 IDE 中免费提供的,它们有助于建立以下方面的肌肉记忆:
- 在编写代码时注意到源代码中的警告和错误
- 将鼠标悬停在已标记的代码上以了解违反规则的情况
- 使用 alt+Enter 对问题应用快速修复

SpotBug
这个 SpotBug IntelliJ 插件使用静态分析来尝试提醒您注意代码中的错误。
可以在 IntelliJ 偏好设置中配置 SpotBugs 来扫描您的代码,实际使用的规则可以在检测器选项卡中找到。

在我编写和审查了我的代码之后,我倾向于使用SpotBugs,然后我将运行 “分析包括测试源在内的项目文件”。

这确实可以帮助我识别错误、死代码和明显的优化。它还迫使我研究一些举报的违规行为,以帮助我决定该怎么做。
SpotBugs 会发现问题,但不提供任何 QuickFix 操作来尝试解决问题。
SpotBugs 易于配置,我发现在我的 IDE 中可以参考客观的第二意见。
声波提示器(SonarLint)
这个 SonarLint 插件。
可以从 IntelliJ 首选项中配置 SonarLint,以选择根据哪些规则对代码进行验证。

默认情况下,SonarLint 实时运行并显示您正在编辑的当前代码的问题。
SonarLint不提供快速修复,但与违规报告相关的文档通常清晰且有据可查。
过去,我发现SonarLint在提醒我注意新版本的Java中发现的新Java功能方面很有用。
Check 风格
这个 Check 风格 插件提供了格式和代码质量规则的组合。
CheckStyle 插件与 “Sun Checks” 和 “Google Checks” 捆绑在一起。
这些的定义很容易 在网上找到的。
当项目花时间创建自己的规则集时,CheckStyle 可以增加最大的价值。然后,可以将 IDE 插件配置为使用该规则集,程序员可以在将代码提交到 CI 之前执行扫描。
当 CheckStyle 违规次数超过阈值时,CheckStyle 通常用作 CI 进程的构建失败插件。
老师
老师 使用基于抽象语法树 (AST) 的静态分析来匹配代码和创建 QuickFixes,这样可以非常具体地识别有问题的代码。
AST 允许与配方关联的 QuickFixes 了解周围的代码,例如,在向代码中添加新类时,该类的任何导入都只会添加到源文件一次,而不是每次替换。
Sensei 的创建是为了便于构建自定义匹配规则,这些规则在其他工具中可能不存在或难以配置。
无需修改配置文件,所有配置都可以在 GUI 中执行。创建新配方时,GUI 可以轻松查看配方匹配的代码。在定义 QuickFixes 时,可以立即比较代码的前后状态。这样可以更轻松地创建非常符合情境的食谱,即团队、技术甚至是个人程序员所独有的。

我将 Sensei 与其他静态分析工具结合使用,例如,大多数静态分析工具会发现问题,但无法修复问题。Sensei 的一个常见用例是在 Sensei 中复制其他工具的匹配搜索,然后使用 Quick Fix 对其进行扩展。这样做的好处是应用的自定义修复已经符合项目的编码标准。
我经常发现自己创建的 Sensei 配方已经存在于 IntelliJ Intensions 集合中,这是因为 Intension 报告与我创建的上下文不太匹配,或者因为 IntelliJ 提供的 QuickFix 与我想使用的代码模式不匹配。
我对现有工具进行了扩充,而不是尝试完全替换它们。
当您识别常见规则的上下文变体时,Sensei 也非常有用,例如,如果您使用静态分析工具不支持的 SQL 库,但静态分析引擎中的常见 SQL 规则仍然适用,则可以使用 Sensei 创建这些规则的库特定变体。
Sensei没有像提到的静态分析工具那样开箱即用的很多通用配方,它的优势在于可以轻松创建新的配方,并配置QuickFixes以匹配您的特定编码风格和用例。
注意:我们正在开发一个涵盖通用用例的公共配方存储库,以及 你可以在这里找到。
摘要
我倾向于选择协同工作、可配置且易于扩展以满足我的特定环境的工具。多年来,我一直在 IDE 中使用静态分析工具来帮助我识别问题,并详细了解我使用的编程语言和库。
我将提到的所有工具组合使用:
- IntelliJ Intents 可以帮助开箱即用地发现常见的代码问题,通常是相关的快速修复。
- SpotBugs 会发现我可能遗漏的简单错误,并提醒我注意性能问题。
- SonarLint 识别了我不知道的 Java 功能,并提示我使用其他方法来建模我的代码。
- CheckStyle 可以帮助我遵守商定的编码风格,这种风格在 CI 期间也强制执行。
- Sensei 帮助我创建 QuickFixes 以增强静态分析工具发现的常见场景,并创建可能难以在其他工具中配置的特定项目或技术方案。
---
使用 “首选项\ 插件”(Mac)或 “设置\ 插件”(Windows)从 IntelliJ 中安装 Sensei,然后只需搜索 “sensei 安全代码” 即可。
你可以在 Secure Code Warrior GitHub 账户的 “sensei-blog-examples” 项目中找到示例代码和常见用例配方的存储库。
https://github.com/securecodewarrior/sensei-blog-examples
Alan Richardson拥有超过20年的专业IT经验,他曾作为一名开发人员,在测试层次的各个层面工作,从测试员到测试主管。在Secure Code Warrior ,他是开发者关系主管,直接与团队合作,以改善高质量安全代码的开发。Alan是四本书的作者,包括 "Dear Evil Tester "和 "Java For Testers"。艾伦还创建了在线培训courses ,帮助人们学习技术网络测试和用Java编写的Selenium WebDriver。Alan在SeleniumSimplified.com、EvilTester.com、JavaForTesters.com和CompendiumDev.co.uk上发布他的写作和培训视频。

Secure Code Warrior可帮助您的组织在整个软件开发生命周期中保护代码,并营造一种将网络安全置于首位的文化。无论您是应用安全经理、开发人员、首席信息安全官还是任何与安全相关的人员,我们都能帮助您的组织降低与不安全代码相关的风险。
预约演示Alan Richardson拥有超过20年的专业IT经验,他曾作为一名开发人员,在测试层次的各个层面工作,从测试员到测试主管。在Secure Code Warrior ,他是开发者关系主管,直接与团队合作,以改善高质量安全代码的开发。Alan是四本书的作者,包括 "Dear Evil Tester "和 "Java For Testers"。艾伦还创建了在线培训courses ,帮助人们学习技术网络测试和用Java编写的Selenium WebDriver。Alan在SeleniumSimplified.com、EvilTester.com、JavaForTesters.com和CompendiumDev.co.uk上发布他的写作和培训视频。
什么是静态分析?
静态分析是在不执行应用程序的情况下自动分析源代码。
当在程序执行期间进行分析时,它被称为动态分析。
静态分析通常用于检测:
- 安全漏洞。
- 性能问题。
- 不遵守标准。
- 使用过时的编程结构。
静态分析工具是如何工作的?
所有静态分析工具的基本概念是搜索源代码以识别具有某种警告或相关信息的特定编码模式。
这可能就像 “JUnit 5 测试类不需要'公开'” 一样简单。或者一些难以识别的东西,例如 “在 SQL 执行语句中使用了不可信的字符串输入”。
静态分析工具实现此功能的方式各不相同。
- 用于创建抽象语法树(AST)的源代码解析技术,
- 文本正则表达式匹配,
- 以上各项的组合。
文本上的正则表达式匹配非常灵活,易于编写匹配规则,但通常会导致大量误报,并且匹配规则对周围的代码上下文一无所知。
AST matching 将源代码视为程序代码,而不仅仅是充满文本的文件,这允许进行更具体的上下文匹配,并且可以减少针对代码报告的误报数量。
持续集成中的静态分析
静态分析通常在持续集成 (CI) 过程中执行,以生成合规性问题报告,可以对其进行审查,从而客观地了解一段时间内的代码库。
有些人将静态分析工具配置为仅测量代码的特定部分,并且仅报告一部分规则,从而使用静态分析作为其代码质量的客观衡量标准。
客观性是由所使用的规则提供的,因为这些规则对代码的评估不会随着时间的推移而变化。显然,所使用的规则及其配置的组合是一个主观的决定,不同的团队选择在不同的时间使用不同的规则。
在 CI 中执行静态分析很有用,但可能会延迟向程序员提供反馈。程序员在编码时不会收到反馈,他们稍后通过静态分析工具运行代码时会收到反馈。在 CI 中运行静态分析的另一个副作用是结果更容易被忽视。
为了帮助团队更加关注静态分析的结果,通常可以在构建过程中配置阈值指标,使其在超过该指标(例如触发了许多规则)时生成失败。
IDE 中的静态分析
为了更快地接收反馈,有许多 IDE 插件可以根据需要在 IDE 中运行静态分析规则,或者在代码更改时定期运行静态分析规则。
然后,当程序员编写代码时,可以在 IDE 中看到违反规则的情况,为了使规则更难忽视,通常可以将违规行为配置为在编辑器中呈现为带下划线的代码。
我个人认为这是改进编码的有用方法,尤其是在使用静态分析工具涵盖的新库时。尽管它可能会 “嘈杂”,带有误报或您不感兴趣的规则。但是,通过采取额外步骤将静态分析工具配置为忽略某些规则,可以解决这个问题。
根据静态分析规则修复代码
在大多数静态分析工具中,规则的修复留给了程序员,因此他们必须了解违反规则的原因以及如何修复规则。
很少有静态分析工具也包含修复违规行为的功能,因为修复通常取决于团队和所使用的技术以及他们商定的编码风格。
默认规则
当静态分析工具附带默认规则时,可能会对规则的质量产生错误的信心,人们很容易相信它们涵盖了程序员可能遇到的所有问题以及该规则应适用的所有情况。有时,应适用规则的情况可能很微妙,可能不容易被发现。
希望通过使用静态分析工具,更详细地研究规则和违规行为,程序员能够培养在特定领域中发现和避免问题的技能。
当域需要上下文规则时,静态分析工具可能没有任何与您的域或库相匹配的规则,此外,这些工具通常很难配置和扩展。
烦恼
这些 “烦恼” 都不是不可克服的:
- 假阳性
- 缺乏修复
- 忽略规则的配置
- 添加特定于上下文的规则
但是,它们通常被用作一开始就避免使用静态分析工具的借口,这很遗憾,因为使用静态分析可能非常有用,可以:
- 向初级开发人员重点介绍更好的方法
- 快速获得有关明显的编码违规行为的反馈
- 找出程序员以前从未遇到过的模糊问题
- 强调程序员采用了良好的编码方法(未报告违规行为时)
基于 IDE 的静态分析工具
作为项目的个人贡献者,我喜欢使用在 IDE 中运行的静态分析工具,这样我就能快速收到有关代码的反馈。
这补充了项目可能具有的任何拉取请求审查流程和CI集成。
我会尝试找出能给我带来优势的工具,并改善我的个人工作流程。
当工具在 IDE 中运行时,由于它们往往使用相同的基本 GUI 和配置方法,因此交替查看它们可能很诱人。
这些工具可能具有重叠的功能或规则集,但是为了获得最大的优势,我安装了多个工具以利用它们的优势。
下面列出了我在编码时积极使用的静态分析 IDE 工具:
- 内置的 IntelliJ 检查-常见的编码模式
- SpotBugs-常见错误
- SonarLint-常见使用模式
- CheckStyle-常见的样式模式
- 来自 Secure Code Warrior 的老师-创建自定义规则
我之所以使用它们,是因为它们可以很好地协同工作,相互补充和补充。
IntelliJ 检查
如果你使用IntelliJ,那么你已经在使用他们的检查了。
这些是在 IDE 中标记的静态分析规则。其中一些还具有QuickFix选项,可以重写代码以解决问题。
这些规则可以开启和关闭,也可以选择用于在 IDE 中突出显示该错误的错误级别。

有很多不错的 IntelliJ 检查项目。我知道这是因为我在写这篇文章时通读了它们。我使用IntelliJ检查作为默认值,但尚未对其进行配置,但是要从检查中获得全部价值,您应该通读它们,确定与您的编码风格相关的内容,并配置警告级别,以便您在代码中注意到它们。
IntelliJ 检查的好处在于,它们是在 IDE 中免费提供的,它们有助于建立以下方面的肌肉记忆:
- 在编写代码时注意到源代码中的警告和错误
- 将鼠标悬停在已标记的代码上以了解违反规则的情况
- 使用 alt+Enter 对问题应用快速修复

SpotBug
这个 SpotBug IntelliJ 插件使用静态分析来尝试提醒您注意代码中的错误。
可以在 IntelliJ 偏好设置中配置 SpotBugs 来扫描您的代码,实际使用的规则可以在检测器选项卡中找到。

在我编写和审查了我的代码之后,我倾向于使用SpotBugs,然后我将运行 “分析包括测试源在内的项目文件”。

这确实可以帮助我识别错误、死代码和明显的优化。它还迫使我研究一些举报的违规行为,以帮助我决定该怎么做。
SpotBugs 会发现问题,但不提供任何 QuickFix 操作来尝试解决问题。
SpotBugs 易于配置,我发现在我的 IDE 中可以参考客观的第二意见。
声波提示器(SonarLint)
这个 SonarLint 插件。
可以从 IntelliJ 首选项中配置 SonarLint,以选择根据哪些规则对代码进行验证。

默认情况下,SonarLint 实时运行并显示您正在编辑的当前代码的问题。
SonarLint不提供快速修复,但与违规报告相关的文档通常清晰且有据可查。
过去,我发现SonarLint在提醒我注意新版本的Java中发现的新Java功能方面很有用。
Check 风格
这个 Check 风格 插件提供了格式和代码质量规则的组合。
CheckStyle 插件与 “Sun Checks” 和 “Google Checks” 捆绑在一起。
这些的定义很容易 在网上找到的。
当项目花时间创建自己的规则集时,CheckStyle 可以增加最大的价值。然后,可以将 IDE 插件配置为使用该规则集,程序员可以在将代码提交到 CI 之前执行扫描。
当 CheckStyle 违规次数超过阈值时,CheckStyle 通常用作 CI 进程的构建失败插件。
老师
老师 使用基于抽象语法树 (AST) 的静态分析来匹配代码和创建 QuickFixes,这样可以非常具体地识别有问题的代码。
AST 允许与配方关联的 QuickFixes 了解周围的代码,例如,在向代码中添加新类时,该类的任何导入都只会添加到源文件一次,而不是每次替换。
Sensei 的创建是为了便于构建自定义匹配规则,这些规则在其他工具中可能不存在或难以配置。
无需修改配置文件,所有配置都可以在 GUI 中执行。创建新配方时,GUI 可以轻松查看配方匹配的代码。在定义 QuickFixes 时,可以立即比较代码的前后状态。这样可以更轻松地创建非常符合情境的食谱,即团队、技术甚至是个人程序员所独有的。

我将 Sensei 与其他静态分析工具结合使用,例如,大多数静态分析工具会发现问题,但无法修复问题。Sensei 的一个常见用例是在 Sensei 中复制其他工具的匹配搜索,然后使用 Quick Fix 对其进行扩展。这样做的好处是应用的自定义修复已经符合项目的编码标准。
我经常发现自己创建的 Sensei 配方已经存在于 IntelliJ Intensions 集合中,这是因为 Intension 报告与我创建的上下文不太匹配,或者因为 IntelliJ 提供的 QuickFix 与我想使用的代码模式不匹配。
我对现有工具进行了扩充,而不是尝试完全替换它们。
当您识别常见规则的上下文变体时,Sensei 也非常有用,例如,如果您使用静态分析工具不支持的 SQL 库,但静态分析引擎中的常见 SQL 规则仍然适用,则可以使用 Sensei 创建这些规则的库特定变体。
Sensei没有像提到的静态分析工具那样开箱即用的很多通用配方,它的优势在于可以轻松创建新的配方,并配置QuickFixes以匹配您的特定编码风格和用例。
注意:我们正在开发一个涵盖通用用例的公共配方存储库,以及 你可以在这里找到。
摘要
我倾向于选择协同工作、可配置且易于扩展以满足我的特定环境的工具。多年来,我一直在 IDE 中使用静态分析工具来帮助我识别问题,并详细了解我使用的编程语言和库。
我将提到的所有工具组合使用:
- IntelliJ Intents 可以帮助开箱即用地发现常见的代码问题,通常是相关的快速修复。
- SpotBugs 会发现我可能遗漏的简单错误,并提醒我注意性能问题。
- SonarLint 识别了我不知道的 Java 功能,并提示我使用其他方法来建模我的代码。
- CheckStyle 可以帮助我遵守商定的编码风格,这种风格在 CI 期间也强制执行。
- Sensei 帮助我创建 QuickFixes 以增强静态分析工具发现的常见场景,并创建可能难以在其他工具中配置的特定项目或技术方案。
---
使用 “首选项\ 插件”(Mac)或 “设置\ 插件”(Windows)从 IntelliJ 中安装 Sensei,然后只需搜索 “sensei 安全代码” 即可。
你可以在 Secure Code Warrior GitHub 账户的 “sensei-blog-examples” 项目中找到示例代码和常见用例配方的存储库。
https://github.com/securecodewarrior/sensei-blog-examples
什么是静态分析?
静态分析是在不执行应用程序的情况下自动分析源代码。
当在程序执行期间进行分析时,它被称为动态分析。
静态分析通常用于检测:
- 安全漏洞。
- 性能问题。
- 不遵守标准。
- 使用过时的编程结构。
静态分析工具是如何工作的?
所有静态分析工具的基本概念是搜索源代码以识别具有某种警告或相关信息的特定编码模式。
这可能就像 “JUnit 5 测试类不需要'公开'” 一样简单。或者一些难以识别的东西,例如 “在 SQL 执行语句中使用了不可信的字符串输入”。
静态分析工具实现此功能的方式各不相同。
- 用于创建抽象语法树(AST)的源代码解析技术,
- 文本正则表达式匹配,
- 以上各项的组合。
文本上的正则表达式匹配非常灵活,易于编写匹配规则,但通常会导致大量误报,并且匹配规则对周围的代码上下文一无所知。
AST matching 将源代码视为程序代码,而不仅仅是充满文本的文件,这允许进行更具体的上下文匹配,并且可以减少针对代码报告的误报数量。
持续集成中的静态分析
静态分析通常在持续集成 (CI) 过程中执行,以生成合规性问题报告,可以对其进行审查,从而客观地了解一段时间内的代码库。
有些人将静态分析工具配置为仅测量代码的特定部分,并且仅报告一部分规则,从而使用静态分析作为其代码质量的客观衡量标准。
客观性是由所使用的规则提供的,因为这些规则对代码的评估不会随着时间的推移而变化。显然,所使用的规则及其配置的组合是一个主观的决定,不同的团队选择在不同的时间使用不同的规则。
在 CI 中执行静态分析很有用,但可能会延迟向程序员提供反馈。程序员在编码时不会收到反馈,他们稍后通过静态分析工具运行代码时会收到反馈。在 CI 中运行静态分析的另一个副作用是结果更容易被忽视。
为了帮助团队更加关注静态分析的结果,通常可以在构建过程中配置阈值指标,使其在超过该指标(例如触发了许多规则)时生成失败。
IDE 中的静态分析
为了更快地接收反馈,有许多 IDE 插件可以根据需要在 IDE 中运行静态分析规则,或者在代码更改时定期运行静态分析规则。
然后,当程序员编写代码时,可以在 IDE 中看到违反规则的情况,为了使规则更难忽视,通常可以将违规行为配置为在编辑器中呈现为带下划线的代码。
我个人认为这是改进编码的有用方法,尤其是在使用静态分析工具涵盖的新库时。尽管它可能会 “嘈杂”,带有误报或您不感兴趣的规则。但是,通过采取额外步骤将静态分析工具配置为忽略某些规则,可以解决这个问题。
根据静态分析规则修复代码
在大多数静态分析工具中,规则的修复留给了程序员,因此他们必须了解违反规则的原因以及如何修复规则。
很少有静态分析工具也包含修复违规行为的功能,因为修复通常取决于团队和所使用的技术以及他们商定的编码风格。
默认规则
当静态分析工具附带默认规则时,可能会对规则的质量产生错误的信心,人们很容易相信它们涵盖了程序员可能遇到的所有问题以及该规则应适用的所有情况。有时,应适用规则的情况可能很微妙,可能不容易被发现。
希望通过使用静态分析工具,更详细地研究规则和违规行为,程序员能够培养在特定领域中发现和避免问题的技能。
当域需要上下文规则时,静态分析工具可能没有任何与您的域或库相匹配的规则,此外,这些工具通常很难配置和扩展。
烦恼
这些 “烦恼” 都不是不可克服的:
- 假阳性
- 缺乏修复
- 忽略规则的配置
- 添加特定于上下文的规则
但是,它们通常被用作一开始就避免使用静态分析工具的借口,这很遗憾,因为使用静态分析可能非常有用,可以:
- 向初级开发人员重点介绍更好的方法
- 快速获得有关明显的编码违规行为的反馈
- 找出程序员以前从未遇到过的模糊问题
- 强调程序员采用了良好的编码方法(未报告违规行为时)
基于 IDE 的静态分析工具
作为项目的个人贡献者,我喜欢使用在 IDE 中运行的静态分析工具,这样我就能快速收到有关代码的反馈。
这补充了项目可能具有的任何拉取请求审查流程和CI集成。
我会尝试找出能给我带来优势的工具,并改善我的个人工作流程。
当工具在 IDE 中运行时,由于它们往往使用相同的基本 GUI 和配置方法,因此交替查看它们可能很诱人。
这些工具可能具有重叠的功能或规则集,但是为了获得最大的优势,我安装了多个工具以利用它们的优势。
下面列出了我在编码时积极使用的静态分析 IDE 工具:
- 内置的 IntelliJ 检查-常见的编码模式
- SpotBugs-常见错误
- SonarLint-常见使用模式
- CheckStyle-常见的样式模式
- 来自 Secure Code Warrior 的老师-创建自定义规则
我之所以使用它们,是因为它们可以很好地协同工作,相互补充和补充。
IntelliJ 检查
如果你使用IntelliJ,那么你已经在使用他们的检查了。
这些是在 IDE 中标记的静态分析规则。其中一些还具有QuickFix选项,可以重写代码以解决问题。
这些规则可以开启和关闭,也可以选择用于在 IDE 中突出显示该错误的错误级别。

有很多不错的 IntelliJ 检查项目。我知道这是因为我在写这篇文章时通读了它们。我使用IntelliJ检查作为默认值,但尚未对其进行配置,但是要从检查中获得全部价值,您应该通读它们,确定与您的编码风格相关的内容,并配置警告级别,以便您在代码中注意到它们。
IntelliJ 检查的好处在于,它们是在 IDE 中免费提供的,它们有助于建立以下方面的肌肉记忆:
- 在编写代码时注意到源代码中的警告和错误
- 将鼠标悬停在已标记的代码上以了解违反规则的情况
- 使用 alt+Enter 对问题应用快速修复

SpotBug
这个 SpotBug IntelliJ 插件使用静态分析来尝试提醒您注意代码中的错误。
可以在 IntelliJ 偏好设置中配置 SpotBugs 来扫描您的代码,实际使用的规则可以在检测器选项卡中找到。

在我编写和审查了我的代码之后,我倾向于使用SpotBugs,然后我将运行 “分析包括测试源在内的项目文件”。

这确实可以帮助我识别错误、死代码和明显的优化。它还迫使我研究一些举报的违规行为,以帮助我决定该怎么做。
SpotBugs 会发现问题,但不提供任何 QuickFix 操作来尝试解决问题。
SpotBugs 易于配置,我发现在我的 IDE 中可以参考客观的第二意见。
声波提示器(SonarLint)
这个 SonarLint 插件。
可以从 IntelliJ 首选项中配置 SonarLint,以选择根据哪些规则对代码进行验证。

默认情况下,SonarLint 实时运行并显示您正在编辑的当前代码的问题。
SonarLint不提供快速修复,但与违规报告相关的文档通常清晰且有据可查。
过去,我发现SonarLint在提醒我注意新版本的Java中发现的新Java功能方面很有用。
Check 风格
这个 Check 风格 插件提供了格式和代码质量规则的组合。
CheckStyle 插件与 “Sun Checks” 和 “Google Checks” 捆绑在一起。
这些的定义很容易 在网上找到的。
当项目花时间创建自己的规则集时,CheckStyle 可以增加最大的价值。然后,可以将 IDE 插件配置为使用该规则集,程序员可以在将代码提交到 CI 之前执行扫描。
当 CheckStyle 违规次数超过阈值时,CheckStyle 通常用作 CI 进程的构建失败插件。
老师
老师 使用基于抽象语法树 (AST) 的静态分析来匹配代码和创建 QuickFixes,这样可以非常具体地识别有问题的代码。
AST 允许与配方关联的 QuickFixes 了解周围的代码,例如,在向代码中添加新类时,该类的任何导入都只会添加到源文件一次,而不是每次替换。
Sensei 的创建是为了便于构建自定义匹配规则,这些规则在其他工具中可能不存在或难以配置。
无需修改配置文件,所有配置都可以在 GUI 中执行。创建新配方时,GUI 可以轻松查看配方匹配的代码。在定义 QuickFixes 时,可以立即比较代码的前后状态。这样可以更轻松地创建非常符合情境的食谱,即团队、技术甚至是个人程序员所独有的。

我将 Sensei 与其他静态分析工具结合使用,例如,大多数静态分析工具会发现问题,但无法修复问题。Sensei 的一个常见用例是在 Sensei 中复制其他工具的匹配搜索,然后使用 Quick Fix 对其进行扩展。这样做的好处是应用的自定义修复已经符合项目的编码标准。
我经常发现自己创建的 Sensei 配方已经存在于 IntelliJ Intensions 集合中,这是因为 Intension 报告与我创建的上下文不太匹配,或者因为 IntelliJ 提供的 QuickFix 与我想使用的代码模式不匹配。
我对现有工具进行了扩充,而不是尝试完全替换它们。
当您识别常见规则的上下文变体时,Sensei 也非常有用,例如,如果您使用静态分析工具不支持的 SQL 库,但静态分析引擎中的常见 SQL 规则仍然适用,则可以使用 Sensei 创建这些规则的库特定变体。
Sensei没有像提到的静态分析工具那样开箱即用的很多通用配方,它的优势在于可以轻松创建新的配方,并配置QuickFixes以匹配您的特定编码风格和用例。
注意:我们正在开发一个涵盖通用用例的公共配方存储库,以及 你可以在这里找到。
摘要
我倾向于选择协同工作、可配置且易于扩展以满足我的特定环境的工具。多年来,我一直在 IDE 中使用静态分析工具来帮助我识别问题,并详细了解我使用的编程语言和库。
我将提到的所有工具组合使用:
- IntelliJ Intents 可以帮助开箱即用地发现常见的代码问题,通常是相关的快速修复。
- SpotBugs 会发现我可能遗漏的简单错误,并提醒我注意性能问题。
- SonarLint 识别了我不知道的 Java 功能,并提示我使用其他方法来建模我的代码。
- CheckStyle 可以帮助我遵守商定的编码风格,这种风格在 CI 期间也强制执行。
- Sensei 帮助我创建 QuickFixes 以增强静态分析工具发现的常见场景,并创建可能难以在其他工具中配置的特定项目或技术方案。
---
使用 “首选项\ 插件”(Mac)或 “设置\ 插件”(Windows)从 IntelliJ 中安装 Sensei,然后只需搜索 “sensei 安全代码” 即可。
你可以在 Secure Code Warrior GitHub 账户的 “sensei-blog-examples” 项目中找到示例代码和常见用例配方的存储库。
https://github.com/securecodewarrior/sensei-blog-examples

点击下面的链接并下载此资源的PDF。
Secure Code Warrior可帮助您的组织在整个软件开发生命周期中保护代码,并营造一种将网络安全置于首位的文化。无论您是应用安全经理、开发人员、首席信息安全官还是任何与安全相关的人员,我们都能帮助您的组织降低与不安全代码相关的风险。
查看报告预约演示Alan Richardson拥有超过20年的专业IT经验,他曾作为一名开发人员,在测试层次的各个层面工作,从测试员到测试主管。在Secure Code Warrior ,他是开发者关系主管,直接与团队合作,以改善高质量安全代码的开发。Alan是四本书的作者,包括 "Dear Evil Tester "和 "Java For Testers"。艾伦还创建了在线培训courses ,帮助人们学习技术网络测试和用Java编写的Selenium WebDriver。Alan在SeleniumSimplified.com、EvilTester.com、JavaForTesters.com和CompendiumDev.co.uk上发布他的写作和培训视频。
什么是静态分析?
静态分析是在不执行应用程序的情况下自动分析源代码。
当在程序执行期间进行分析时,它被称为动态分析。
静态分析通常用于检测:
- 安全漏洞。
- 性能问题。
- 不遵守标准。
- 使用过时的编程结构。
静态分析工具是如何工作的?
所有静态分析工具的基本概念是搜索源代码以识别具有某种警告或相关信息的特定编码模式。
这可能就像 “JUnit 5 测试类不需要'公开'” 一样简单。或者一些难以识别的东西,例如 “在 SQL 执行语句中使用了不可信的字符串输入”。
静态分析工具实现此功能的方式各不相同。
- 用于创建抽象语法树(AST)的源代码解析技术,
- 文本正则表达式匹配,
- 以上各项的组合。
文本上的正则表达式匹配非常灵活,易于编写匹配规则,但通常会导致大量误报,并且匹配规则对周围的代码上下文一无所知。
AST matching 将源代码视为程序代码,而不仅仅是充满文本的文件,这允许进行更具体的上下文匹配,并且可以减少针对代码报告的误报数量。
持续集成中的静态分析
静态分析通常在持续集成 (CI) 过程中执行,以生成合规性问题报告,可以对其进行审查,从而客观地了解一段时间内的代码库。
有些人将静态分析工具配置为仅测量代码的特定部分,并且仅报告一部分规则,从而使用静态分析作为其代码质量的客观衡量标准。
客观性是由所使用的规则提供的,因为这些规则对代码的评估不会随着时间的推移而变化。显然,所使用的规则及其配置的组合是一个主观的决定,不同的团队选择在不同的时间使用不同的规则。
在 CI 中执行静态分析很有用,但可能会延迟向程序员提供反馈。程序员在编码时不会收到反馈,他们稍后通过静态分析工具运行代码时会收到反馈。在 CI 中运行静态分析的另一个副作用是结果更容易被忽视。
为了帮助团队更加关注静态分析的结果,通常可以在构建过程中配置阈值指标,使其在超过该指标(例如触发了许多规则)时生成失败。
IDE 中的静态分析
为了更快地接收反馈,有许多 IDE 插件可以根据需要在 IDE 中运行静态分析规则,或者在代码更改时定期运行静态分析规则。
然后,当程序员编写代码时,可以在 IDE 中看到违反规则的情况,为了使规则更难忽视,通常可以将违规行为配置为在编辑器中呈现为带下划线的代码。
我个人认为这是改进编码的有用方法,尤其是在使用静态分析工具涵盖的新库时。尽管它可能会 “嘈杂”,带有误报或您不感兴趣的规则。但是,通过采取额外步骤将静态分析工具配置为忽略某些规则,可以解决这个问题。
根据静态分析规则修复代码
在大多数静态分析工具中,规则的修复留给了程序员,因此他们必须了解违反规则的原因以及如何修复规则。
很少有静态分析工具也包含修复违规行为的功能,因为修复通常取决于团队和所使用的技术以及他们商定的编码风格。
默认规则
当静态分析工具附带默认规则时,可能会对规则的质量产生错误的信心,人们很容易相信它们涵盖了程序员可能遇到的所有问题以及该规则应适用的所有情况。有时,应适用规则的情况可能很微妙,可能不容易被发现。
希望通过使用静态分析工具,更详细地研究规则和违规行为,程序员能够培养在特定领域中发现和避免问题的技能。
当域需要上下文规则时,静态分析工具可能没有任何与您的域或库相匹配的规则,此外,这些工具通常很难配置和扩展。
烦恼
这些 “烦恼” 都不是不可克服的:
- 假阳性
- 缺乏修复
- 忽略规则的配置
- 添加特定于上下文的规则
但是,它们通常被用作一开始就避免使用静态分析工具的借口,这很遗憾,因为使用静态分析可能非常有用,可以:
- 向初级开发人员重点介绍更好的方法
- 快速获得有关明显的编码违规行为的反馈
- 找出程序员以前从未遇到过的模糊问题
- 强调程序员采用了良好的编码方法(未报告违规行为时)
基于 IDE 的静态分析工具
作为项目的个人贡献者,我喜欢使用在 IDE 中运行的静态分析工具,这样我就能快速收到有关代码的反馈。
这补充了项目可能具有的任何拉取请求审查流程和CI集成。
我会尝试找出能给我带来优势的工具,并改善我的个人工作流程。
当工具在 IDE 中运行时,由于它们往往使用相同的基本 GUI 和配置方法,因此交替查看它们可能很诱人。
这些工具可能具有重叠的功能或规则集,但是为了获得最大的优势,我安装了多个工具以利用它们的优势。
下面列出了我在编码时积极使用的静态分析 IDE 工具:
- 内置的 IntelliJ 检查-常见的编码模式
- SpotBugs-常见错误
- SonarLint-常见使用模式
- CheckStyle-常见的样式模式
- 来自 Secure Code Warrior 的老师-创建自定义规则
我之所以使用它们,是因为它们可以很好地协同工作,相互补充和补充。
IntelliJ 检查
如果你使用IntelliJ,那么你已经在使用他们的检查了。
这些是在 IDE 中标记的静态分析规则。其中一些还具有QuickFix选项,可以重写代码以解决问题。
这些规则可以开启和关闭,也可以选择用于在 IDE 中突出显示该错误的错误级别。

有很多不错的 IntelliJ 检查项目。我知道这是因为我在写这篇文章时通读了它们。我使用IntelliJ检查作为默认值,但尚未对其进行配置,但是要从检查中获得全部价值,您应该通读它们,确定与您的编码风格相关的内容,并配置警告级别,以便您在代码中注意到它们。
IntelliJ 检查的好处在于,它们是在 IDE 中免费提供的,它们有助于建立以下方面的肌肉记忆:
- 在编写代码时注意到源代码中的警告和错误
- 将鼠标悬停在已标记的代码上以了解违反规则的情况
- 使用 alt+Enter 对问题应用快速修复

SpotBug
这个 SpotBug IntelliJ 插件使用静态分析来尝试提醒您注意代码中的错误。
可以在 IntelliJ 偏好设置中配置 SpotBugs 来扫描您的代码,实际使用的规则可以在检测器选项卡中找到。

在我编写和审查了我的代码之后,我倾向于使用SpotBugs,然后我将运行 “分析包括测试源在内的项目文件”。

这确实可以帮助我识别错误、死代码和明显的优化。它还迫使我研究一些举报的违规行为,以帮助我决定该怎么做。
SpotBugs 会发现问题,但不提供任何 QuickFix 操作来尝试解决问题。
SpotBugs 易于配置,我发现在我的 IDE 中可以参考客观的第二意见。
声波提示器(SonarLint)
这个 SonarLint 插件。
可以从 IntelliJ 首选项中配置 SonarLint,以选择根据哪些规则对代码进行验证。

默认情况下,SonarLint 实时运行并显示您正在编辑的当前代码的问题。
SonarLint不提供快速修复,但与违规报告相关的文档通常清晰且有据可查。
过去,我发现SonarLint在提醒我注意新版本的Java中发现的新Java功能方面很有用。
Check 风格
这个 Check 风格 插件提供了格式和代码质量规则的组合。
CheckStyle 插件与 “Sun Checks” 和 “Google Checks” 捆绑在一起。
这些的定义很容易 在网上找到的。
当项目花时间创建自己的规则集时,CheckStyle 可以增加最大的价值。然后,可以将 IDE 插件配置为使用该规则集,程序员可以在将代码提交到 CI 之前执行扫描。
当 CheckStyle 违规次数超过阈值时,CheckStyle 通常用作 CI 进程的构建失败插件。
老师
老师 使用基于抽象语法树 (AST) 的静态分析来匹配代码和创建 QuickFixes,这样可以非常具体地识别有问题的代码。
AST 允许与配方关联的 QuickFixes 了解周围的代码,例如,在向代码中添加新类时,该类的任何导入都只会添加到源文件一次,而不是每次替换。
Sensei 的创建是为了便于构建自定义匹配规则,这些规则在其他工具中可能不存在或难以配置。
无需修改配置文件,所有配置都可以在 GUI 中执行。创建新配方时,GUI 可以轻松查看配方匹配的代码。在定义 QuickFixes 时,可以立即比较代码的前后状态。这样可以更轻松地创建非常符合情境的食谱,即团队、技术甚至是个人程序员所独有的。

我将 Sensei 与其他静态分析工具结合使用,例如,大多数静态分析工具会发现问题,但无法修复问题。Sensei 的一个常见用例是在 Sensei 中复制其他工具的匹配搜索,然后使用 Quick Fix 对其进行扩展。这样做的好处是应用的自定义修复已经符合项目的编码标准。
我经常发现自己创建的 Sensei 配方已经存在于 IntelliJ Intensions 集合中,这是因为 Intension 报告与我创建的上下文不太匹配,或者因为 IntelliJ 提供的 QuickFix 与我想使用的代码模式不匹配。
我对现有工具进行了扩充,而不是尝试完全替换它们。
当您识别常见规则的上下文变体时,Sensei 也非常有用,例如,如果您使用静态分析工具不支持的 SQL 库,但静态分析引擎中的常见 SQL 规则仍然适用,则可以使用 Sensei 创建这些规则的库特定变体。
Sensei没有像提到的静态分析工具那样开箱即用的很多通用配方,它的优势在于可以轻松创建新的配方,并配置QuickFixes以匹配您的特定编码风格和用例。
注意:我们正在开发一个涵盖通用用例的公共配方存储库,以及 你可以在这里找到。
摘要
我倾向于选择协同工作、可配置且易于扩展以满足我的特定环境的工具。多年来,我一直在 IDE 中使用静态分析工具来帮助我识别问题,并详细了解我使用的编程语言和库。
我将提到的所有工具组合使用:
- IntelliJ Intents 可以帮助开箱即用地发现常见的代码问题,通常是相关的快速修复。
- SpotBugs 会发现我可能遗漏的简单错误,并提醒我注意性能问题。
- SonarLint 识别了我不知道的 Java 功能,并提示我使用其他方法来建模我的代码。
- CheckStyle 可以帮助我遵守商定的编码风格,这种风格在 CI 期间也强制执行。
- Sensei 帮助我创建 QuickFixes 以增强静态分析工具发现的常见场景,并创建可能难以在其他工具中配置的特定项目或技术方案。
---
使用 “首选项\ 插件”(Mac)或 “设置\ 插件”(Windows)从 IntelliJ 中安装 Sensei,然后只需搜索 “sensei 安全代码” 即可。
你可以在 Secure Code Warrior GitHub 账户的 “sensei-blog-examples” 项目中找到示例代码和常见用例配方的存储库。
https://github.com/securecodewarrior/sensei-blog-examples
目录
Alan Richardson拥有超过20年的专业IT经验,他曾作为一名开发人员,在测试层次的各个层面工作,从测试员到测试主管。在Secure Code Warrior ,他是开发者关系主管,直接与团队合作,以改善高质量安全代码的开发。Alan是四本书的作者,包括 "Dear Evil Tester "和 "Java For Testers"。艾伦还创建了在线培训courses ,帮助人们学习技术网络测试和用Java编写的Selenium WebDriver。Alan在SeleniumSimplified.com、EvilTester.com、JavaForTesters.com和CompendiumDev.co.uk上发布他的写作和培训视频。

Secure Code Warrior可帮助您的组织在整个软件开发生命周期中保护代码,并营造一种将网络安全置于首位的文化。无论您是应用安全经理、开发人员、首席信息安全官还是任何与安全相关的人员,我们都能帮助您的组织降低与不安全代码相关的风险。
预约演示下载



%20(1).avif)
.avif)
