【问题标题】:Exclude Generated Code from C# SONAR Analysis从 C# SONAR 分析中排除生成的代码
【发布时间】:2015-09-11 17:12:26
【问题描述】:

所以在 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);
    }

【问题讨论】:

  • 分析仪如何知道它应该从分析中排除该方法?你有没有用一些特殊的属性标记它,它是在一个专门命名的文件中,还是特殊的项目类型?
  • 嗨 Dinesh,我尝试使用 [GeneratedCode] 属性标记该方法,但没有帮助。
  • 如果您在 Visual Studio 中分析上述方法且未选中上述选项,我会发现 CA1305 违规,选中后我不会违规。
  • 好的,我设法在 VS2015 中重现了这种行为。现在,您面临的具体问题是什么? CA1305 在 SonarQube 中报告,但在设置“从生成的代码中抑制结果”标志时不在 Visual Studio 中?还是其他问题?
  • 嗨 Dinesh,是的,这就是我面临的问题。如果我们可以有一个类似的选项来抑制在 Sonar 上生成的代码,那就太好了。谢谢。

标签: c# sonarqube


【解决方案1】:

在构建期间启动 FxCop 时,MSBuild SonarQube Runner(至少在 1.0 和 1.0.1 版本中)总是强制检查“Suppress Results from generated Code(Managed only)”标志.见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 规则将无法理解此标志,但仍会报告该方法。

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

因此,在 SonarQube 中,无论您是否在项目中选中“从生成的代码中抑制结果(仅限托管)”,您都不会看到 CA1305 的问题。

【讨论】:

  • 嗨 Dinesh,我刚刚检查了日志,并且仅使用“/forceoutput /searchgac”标志调用了 FxCop,我没有看到 /ignoregeneratedcode :(。我必须对配置进行任何更改吗? SONAR,要激活这个标志吗?
  • 正如您在 MSBuild SonarQube Runner 源代码中看到的那样,它确实尝试将此标志强制为 true。我可以想象的是,其他一些自定义目标稍后再次将其设置为false。您能否尝试将该方法放入一个新的控制台应用程序项目中(使用默认的 .csproj 文件)?如果这没有帮助,您可以尝试从另一台机器运行分析吗?您还可以提供您正在使用构建项目的 MSBuild 版本吗?我们对 12 和 14 进行了深入测试。
  • 我正在试用 MsBuild Runner,将更新您。谢谢
  • 我忘了提,我使用的不是 MsBuild Runner,而是 Sonar Runner。
  • 嗨 Dinesh,我试用了 MsBuild Runner,它现在忽略了生成的代码,我的设置使用的是 SONARQube runner。这个标志可以在 SONAR runner 中设置吗?如果没有,那么我将不得不迁移到 MsBuild Runner :(。谢谢你的帮助。
【解决方案2】:

我使用这个属性集运行,它排除了生成的代码。

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

如果我们仔细研究,排除包含以下部分:

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

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

【讨论】:

  • 我 Filip,我尝试过这种方法,但它似乎不起作用。
猜你喜欢
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 2012-06-30
  • 1970-01-01
  • 2019-12-26
相关资源
最近更新 更多