从c# SONAR分析中排除生成的代码

本文关键字:代码 排除 SONAR | 更新日期: 2023-09-27 18:11:17

所以在VS2013中,我们有一个选项"从生成的代码中抑制结果(仅管理)"

在通过SONAR执行分析时,我们是否有类似的选择?

当上述选项未选中时,下面的代码报告违规,但我在SONAR中没有看到任何使用上述选项的选项。我确实尝试了Sonar.dotnet.excludeGeneratedCode = true选项,但似乎没有任何区别。

    public IEnumerable<string> YieldTest()
    {
        foreach(var num in Enumerable.Range(100, 100))
            yield return string.Format("{0}", num);
    }

从c# SONAR分析中排除生成的代码

MSBuild SonarQube Runner(至少在1.0和1.0.1版本中)总是强制在构建期间启动FxCop时检查"抑制生成代码(仅管理)"标志。看到SonarQube.Integration.targets # L342

您可以通过查看在RunCodeAnalysis:阶段启动的命令,在构建日志中验证此行为:

RunCodeAnalysis:
  Running Code Analysis...
  C:'Program Files (x86)'Microsoft Visual Studio 14.0'Team Tools'Static Analysis Tools'FxCop'FxCopCmd.exe 
  /outputCulture:1033
  /out:"bin'Debug'ConsoleApplication1.exe.CodeAnalysisLog.xml" /file:"bin'Debug'ConsoleApplication1.exe" /ruleSet:"=C:'Users'dinesh'Desktop'tmp'ConsoleApplication1'.sonarqube'conf''SonarQubeFxCop-cs.ruleset"
  [... references ...]
  /rulesetdirectory:"C:'Program Files (x86)'Microsoft Visual Studio 14.0'Team Tools'Static Analysis Tools''Rule Sets"
  /rule:"-C:'Program Files (x86)'Microsoft Visual Studio 14.0'Team Tools'Static Analysis Tools'FxCop''Rules"
  /searchgac /ignoreinvalidtargets /forceoutput /successfile **/ignoregeneratedcode** /saveMessagesToReport:Active /timeout:120 /reportMissingIndirectAssemblies

你应该看到/ignoregeneratedcode被传递给FxCopCmd.exe。

现在,只有FxCop规则将被这个标志抑制。例如,StyleCop和ReSharper规则将不理解这个标志,并且仍然会报告该方法。

仅供参考,由于yield语句的存在,FxCop似乎排除了该方法:c#编译器在程序集中为该语句生成相当复杂的IL代码。FxCop分析程序集(而不是源代码),这就是为什么它必须将yield语句视为生成的代码。

因此,在SonarQube中,您不应该看到CA1305的问题,无论您是否检查了项目上的"抑制生成代码(仅管理)的结果"。

我使用这个属性运行,它不包括生成的代码。

sonar.exclusions=**/*.Tests/**,**/*Language.Designer.cs,**/*.generated.cs

如果我们仔细看看,排除包括这些部分:

  • /*。Tests/ ==>排除所有以.Tests(递归)结尾的文件夹中的代码
  • **/*Language.Designer.cs ==>排除所有资源id文件
  • **/*.generated.cs ==>排除所有以.generated.cs结尾的文件

如果您使用其他生成的文件(如winforms设计器文件),您将需要询问自己的掩码。