有啥理由不在生产版本中启用 CODE_ANALYSIS?

Posted

技术标签:

【中文标题】有啥理由不在生产版本中启用 CODE_ANALYSIS?【英文标题】:Any reason not to enable CODE_ANALYSIS in production builds?有什么理由不在生产版本中启用 CODE_ANALYSIS? 【发布时间】:2014-03-05 13:44:25 【问题描述】:

在生产(发布)构建中启用静态代码分析是否会产生任何性能成本?

我们的 CI 服务器在 C# 项目的调试版本上运行代码分析,而发布版本禁用了静态代码分析(即未定义 CODE_ANALYSIS)。如果没有理由在生产构建上禁用代码分析,那么我就是在浪费时间进行调试构建。

Reflector 告诉我,如果禁用代码分析,SuppressMessage 属性将被排除,但我不认为额外的属性会影响运行时性能。这是启用静态代码分析(在 Visual Studio 2013 中)的唯一效果吗?

【问题讨论】:

我认为您从错误的角度看待这个问题。代码分析在未优化的 IL(调试版本)上可能会比在优化的 IL(发布版本)上提供更好的结果。 当您已经准备好构建并将发布构建部署到生产环境时,仍然需要修复来自代码分析的警告,这可能需要大量的代码重组和重新测试更改是一种非常低效的方法。性能不是问题。 @hvd 这是我最初想法的一部分,但我找不到任何证据表明代码分析在调试和发布版本中给出了不同的结果。可以吗? @Hans 我们在编译时运行代码分析,如果在代码分析过程中发现任何警告,我们的 CI 服务器会在部署前很久就停止构建链,所以不用担心。 静态代码分析就是这样 - 静态的。它作为构建过程步骤运行。没有理由在可能运行混淆器的构建上运行该构建过程步骤,也没有理由不在这样的构建上运行它。 【参考方案1】:

在启用CODE_ANALYSIS 关键字进行编译时存在实际差异,例如the compiler will remove all [SuppressMessage] attributes from the assembly when it is not enabled(因此可能会导致稍后从命令行运行 FxCop 时显示消息,因为已删除抑制)。如果您在内部系统上安装二进制文件,则可以将抑制保留在二进制文件中。一些公司希望将它们从发布给第三方的程序集中删除,因为这些属性(以及 Justification 属性的内容)的存在可能会泄露敏感信息。

DEBUG 构建上运行代码分析时,您可能会得到更严格的结果,大多数 RELEASE 构建中发生的某些优化可能会导致特定的 FxCop 规则丢失。优化可以删除私有方法(通过内联)或用值代替对常量的调用,而不是常量的定义。 FxCop 无法验证这些项目,因为它们已被删除。这是意料之中的。

为了获得最佳结果:在调试版本中运行代码分析。为了尽可能减少信息泄露,请从 Release 版本中删除 CODE_ANALYSIS 常量。

【讨论】:

答案中的死链接 更新到网络存档。

以上是关于有啥理由不在生产版本中启用 CODE_ANALYSIS?的主要内容,如果未能解决你的问题,请参考以下文章

有啥理由不在 MCU 上增加 .bss 或 .data 部分的大小?

进程终止会自动释放所有使用的内存吗?有啥理由明确地这样做吗?

“定时发布”中的“开始部署到生产”按钮有啥作用

Tailwind 不在生产版本中应用自定义字体系列

Dexie 不在生产版本中存储数据,但在开发版本中一切正常

自动交换和将代码直接推送到生产之间有啥区别?