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

Pan*_*ajH 5 c# sonarqube

所以在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);
    }
Run Code Online (Sandbox Code Playgroud)

Din*_*eyn 2

在构建期间启动 FxCop 时,MSBuild SonarQube Runner(至少在版本 1.0 和 1.0.1 中)始终强制检查“抑制生成代码的结果(仅限托管) ”标志。请参阅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
Run Code Online (Sandbox Code Playgroud)

您应该看到/ignore generatedcode被传递给 FxCopCmd.exe。

现在,只有 FxCop 规则会被该标志抑制。例如,StyleCop 和 ReSharper 规则不会理解此标志,但仍会报告该方法。

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

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