如何抑制宪兵的缺陷?

时间:2010-04-14 13:49:51

标签: code-analysis static-analysis static-code-analysis gendarme

是否可以抑制特定的宪兵缺陷信息? 我想在源代码中用标志或类似的东西来做这件事。

3 个答案:

答案 0 :(得分:5)

正如poupou已经注意到的,版本2.10支持[SuppressMessage]属性。

例如,要禁止使用AvoidNonAlphanumericIdentifierRule规则,请执行以下操作:

[SuppressMessage("Gendarme.Rules.Naming", "AvoidNonAlphanumericIdentifierRule")]
protected void Application_Start()
{
     ...
}

请注意,您需要指定规则所在的程序集的名称...在这种情况下,AvoidNonAlphanumericIdentifierRule位于Gendarme.Rules.Naming.dll中。完整的规则列表及其程序集名称为here

答案 1 :(得分:1)

如果使用控制台运行程序,则可以使用缺陷文件(源代码外)来抑制方法,类型或程序集的任何缺陷。

新的Gendarme 2.8对[SuppressMessage]属性的基本(读取不完整和错误)支持(与fxcop相同)。 2.10发布后,预计此功能将正常工作。

答案 2 :(得分:0)

据我所知,Gendarme中没有办法启用 [SuppressMessage](2.8)。我抓住了GitHub的最新资源,因为它没有按照描述工作。

SupressMessageEngine在代码中,并且有测试通过手动覆盖Runner.Engines.Subscribe来执行它。但是[EngineDependency(typeof(SuppressMessageEngine))]并不适用于所有已编译的规则,这是Gendarme实际运行时订阅的方式。

我也查看了源代码,找到了一种始终通过config订阅特定引擎的方法 - 但是没有。

我可能是错的,但看起来他们忘了回去并应用适当的EngineDependency属性。

我能想到的唯一“解决方法”是编写一个自定义规则,在调用时添加订阅SuppressMessageEngine并且不执行任何其他操作。 Hacky是的,但是这个应该根据我在代码中看到的内容工作。

仅供参考 - 刚刚实施了这个。您需要创建自己的自定义规则,导入Mono.Cecil和Gendarme.Framework并定位.NET framework 3.5

using Gendarme.Framework;
using Gendarme.Framework.Engines;

namespace MyRules
{
   [Problem("Gendarme devs forgot to attribute rules with SuppressMessageEngine")]
   [Solution("Include this rule")]
   [EngineDependency(typeof(SuppressMessageEngine))]
   public class AddSuppressMessageSupportRule : Rule {}
}

可悲的是,这不会引入 那里的FxCopCompatibility属性(即,与Gendarme规则匹配的FxCop规则的SupressMessage也会抑制Gendarme规则),但至少它让你使用宪兵名称来压制。