使用静态代码分析提高 C# 代码质量

对于任何软件项目来说,编写好的代码都很重要。这也是我非常关心的事情。但是,仅通过通读所有内容很难发现问题。
幸运的是,有一个工具可以提供帮助:静态代码分析。

这就像多了一双眼睛自动检查您的代码。静态代码分析可帮助您构建安全、可维护且高质量的 C代码。

以下是本周新闻通讯中我们将要介绍的内容:

  • 静态代码分析
  • .NET 中的静态分析
  • 寻找安全风险

让我们看看静态代码分析如何帮助我们提高代码质量。

什么是静态代码分析?
静态代码分析是一种无需实际运行代码即可检查代码的方法。它会报告与安全性、性能、编码风格或最佳实践相关的任何问题。

通过静态代码分析,您可以“左移”。这样,您就可以在开发过程的早期发现并修复问题,因为此时解决问题的成本较低。

通过编写高质量的代码,您将能够构建更可靠、可扩展且更易于维护的系统。投资代码质量将在任何项目的后期阶段获得回报。

您可以将静态代码分析集成到CI 管道中,以便快速获得反馈循环。我们还可以将其与架构测试相结合,以强制执行其他编码标准。

.NET 中的静态代码分析
.NET 具有内置的 Roslyn 分析器,可检查 C代码是否存在代码风格和质量问题。如果您的项目面向 .NET 5 或更高版本,则默认启用代码分析。

我发现配置静态代码分析的最佳方法是使用Directory.Build.props。这是一个 XML 文件,您可以在其中配置常见的项目属性。您可以将该Directory.Build.props文件放在根文件夹中,以便它适用于所有项目。

您可以配置TargetFramework、、ImplicitUsings(Nullable可空引用类型)等。但我们关心的是配置静态代码分析。

以下是我们可以配置的一些属性:

  • TreatWarningsAsErrors- 将所有警告视为错误。
  • CodeAnalysisTreatWarningsAsErrors- 将代码质量(CAxxxx)警告视为错误。
  • EnforceCodeStyleInBuild- 启用代码风格分析(“IDEXxxx”)规则。
  • AnalysisLevel- 指定要启用哪些分析器。默认值为latest。
  • AnalysisMode- 配置预定义的代码分析配置。

我们还可以为我们的项目安装额外的 NuGet 包。SonarAnalyzer.CSharp包含额外的代码分析器,帮助我们编写干净、安全和可靠的代码。这个库来自构建SonarQube的同一家公司。

<Project>
  <PropertyGroup>
    <TargetFramework>net8.0TargetFramework>
    <ImplicitUsings>enableImplicitUsings>
    <Nullable>enableNullable>

    
    <AnalysisLevel>latestAnalysisLevel>
    <AnalysisMode>AllAnalysisMode>
    <TreatWarningsAsErrors>trueTreatWarningsAsErrors>
    <CodeAnalysisTreatWarningsAsErrors>trueCodeAnalysisTreatWarningsAsErrors>
    <EnforceCodeStyleInBuild>trueEnforceCodeStyleInBuild>
  PropertyGroup>

  <ItemGroup Condition="'$(MSBuildProjectExtension)' != '.dcproj'">
    <PackageReference Include="SonarAnalyzer.CSharp" Version="*">
      <PrivateAssets>allPrivateAssets>
      <IncludeAssets>
        runtime; build; native; contentfiles; analyzers; buildtransitive
      IncludeAssets>
    PackageReference>
  ItemGroup>
Project>

内置的 .NET 分析器和来自的分析器SonarAnalyzer.CSharp非常有用。但它们也会产生很多噪音,包括过多的构建警告。

当你遇到你认为没用的代码分析规则时,你可以关闭它们。你可以在文件中配置单独的代码分析规则.editorconfig。

S125: Sections of code should not be commented out
dotnet_diagnostic.S125.severity = none

S1075: URIs should not be hardcoded
dotnet_diagnostic.S1075.severity = none

S2094: Classes should not be empty
dotnet_diagnostic.S2094.severity = none

S3267: Loops should be simplified with "LINQ" expressions
dotnet_diagnostic.S3267.severity = none

查找(并修复)安全风险
PasswordHasher静态代码分析可以帮助您检测代码中潜在的安全漏洞。以下是仅使用10,000迭代生成密码哈希的示例。S5344来自的规则SonarAnalyzer.CSharp检测到了这个问题并向我们发出警告。建议的最小迭代次数为100,000。

您可以浏览S5344 的解释以了解更多信息:
散列密码存储会给软件应用程序带来重大的安全风险。

启用TreatWarningsAsErrors后,您的构建将失败,直到您解决此问题。这降低了在生产中引入安全风险的可能性。

结论
静态代码分析是一个强大的工具,我将其包含在我的所有 C项目中。它可以帮助我尽早发现问题,从而生成更可靠、更安全的代码,并节省时间和精力。虽然规则的初始设置和微调可能需要一些时间,但长期效益是不可否认的。

请记住,静态代码分析是补充现有开发实践的工具。

您可以通过将静态代码分析与代码审查、单元测试和持续集成等其他技术相结合来创建一个能够持续提供高质量软件的强大开发流程。

拥抱静态代码分析。未来的你(和你的团队)会感谢你。

这是一个示例.editorconfig文件,您可以将其添加到您的项目中并进行自定义以满足您的需要。