在生产(发布)版本中启用静态代码分析时是否存在任何性能成本?
我们的CI服务器在我们的C#项目的调试版本上运行代码分析,而发布版本禁用静态代码分析(即未定义CODE_ANALYSIS)。如果没有理由在生产版本上禁用代码分析,那么我就是在浪费时间进行调试构建。
Reflector向我显示,如果禁用代码分析,则排除SuppressMessage
属性,但我不认为额外属性会影响运行时性能。这是启用静态代码分析的唯一效果(在Visual Studio 2013中)吗?
答案 0 :(得分:6)
在启用CODE_ANALYSIS
关键字时进行编译时存在实际差异,例如the compiler will remove all [SuppressMessage]
attributes from the assembly when it is not enabled(因此,当您从命令行运行FxCop时,可能会导致消息显示,因为抑制具有被删除)。如果您在内部系统上安装二进制文件,可以将抑制项留在二进制文件中。有些公司希望将它们从发布给第三方的程序集中删除,因为这些属性的存在(以及Justification属性的内容)可能会泄露敏感信息。
在DEBUG
版本上运行代码分析时,您可能会得到更严格的结果,大多数RELEASE
版本中发生的某些优化会导致特定的FxCop规则丢失。优化可以删除私有方法(通过内联)或用值替换对常量的调用,而不是常量的定义。 FxCop无法验证这些项目,因为它们已被删除。这是可以预期的。
为获得最佳结果:在Debug版本中运行代码分析。对于最少信息泄露,请从发布版本中删除CODE_ANALYSIS
常量。