静态分析工具在访问变量之前检查锁定

我知道有很多针对C#或.Net的静态分析工具。 请参阅此问题以获取可用工具的良好列表。 我过去曾经使用过其中的一些,他们有很好的方法来发现问题。

我目前正在寻找一种方法来自动执行我们团队中的一些锁定规则。 例如,我想强制执行以下规则:

“使用成员foo的每个公共方法必须获得一个锁定”或“每次对foob​​ar事件的调用都必须在锁定之外”

如果可行 ,编写自定义FxCop规则似乎相当复杂。 有没有更简单的方法呢?

multithreading很难。 使用锁定不是使操作成为线程安全的唯一方法。 开发人员可以使用与循环和Interlocked.CompareExchange的非阻塞同步,或者使用其他一些机制。 规则无法确定某些内容是否是线程安全的。

如果规则的目的是确保高质量的代码,我认为最好的方法是创建一个易于使用的类的线程安全版本。 检查是否只有在理解multithreading的开发人员的代码审查下才能修改更复杂的同步代码。

使用NDepend,您可以在LINQ查询(CQLinq)上编写一个代码规则,该规则可能如下所示:

warnif count > 0 from m in Methods where m.IsUsing ("YourNamespace.YourClass.foo") && ( ! m.IsUsing ("YourNamespace.YourClass.bar") || ! m.IsUsing ("System.Threading.Monitor.Enter(Object)".AllowNoMatch()) || ! m.IsUsing ("System.Threading.Monitor.Exit(Object)".AllowNoMatch()) ) select new { m, m.NbLinesOfCode } 

基本上它将匹配使用字段foo的方法 ,不使用字段 ,或不调用Monitor EnterExit 。 这并不是你要求的,因为你想要明确锁定吧,但这很简单而且非常接近。

注意你也可以写…

 m.AssignField("YourNamespace.YourClass.foo") 

…限制foo上的特定写入/分配字段用法。

可能的解决方案之一可能是实施代码合同 。 您可以定义规则,在编译时运行它们(因此也可以在CI环境中集成),并获得结果。

有关使用CodeContracts作为代码静态分析工具的示例,请参阅:

静态代码分析和代码契约