2012-02-27 34 views
6

C#または.Netの静的解析ツールがかなりあることは知っています。使用可能なツールのリストについては、questionを参照してください。私は過去にそれらのいくつかを使用しており、問題を検出する良い方法があります。変数へのアクセスの前にロックをチェックする静的解析ツール

私は現在、私たちのチームにあるいくつかのロックルールを自動的に実施する方法を探しています。

それとも 「バーのロックを獲得しなければならないメンバーFOOを使用するすべてのパブリックメソッドは」「foobarのイベントへのすべての呼び出しはへの外部からのロックでなければなりません:たとえば、私は、次のルールを適用したいと思いますバー "

feasibleの場合、カスタムFxCopルールを書くのはやや複雑です。それを行う簡単な方法はありますか?

答えて

0

可能な解決策の1つはCode Contractsの実装です。ルールを定義し、コンパイル時に実行します。(CI環境に統合することもできます)と結果を得ることができます。コード静的analysためのツールのようCodeContractsの使用エン例えば

は参照:

Static Code Analysis and Code Contracts

+1

ロックを取らない限り、特定のファイルへのアクセスを禁止する契約をどのように作成しますか? – svick

+0

@svick:ロックは 'lock'ステートメントを使用する必要はありません。オブジェクトがシグナル/ロックされているかどうかを確認するために、他のタイプの 'sync'オブジェクトを使うことができます。 – Tigran

+0

それでも、フィールドへのアクセスをすべてチェックするコード契約をどのように作成しますか? – svick

1

マルチスレッディングが困難です。ロックを使用することは、スレッドセーフな操作を行う唯一の方法ではありません。開発者は、ループとInterlocked.CompareExchangeなどの非ブロッキング同期を使用するか、代わりに他のメカニズムを使用できます。ルールは、何かがスレッドセーフであるかどうかを判断することはできません。

高品質のコードを確保することがルールの目的ならば、これについては、使いやすいクラスのスレッドセーフなバージョンを作成することをお勧めします。より複雑な同期コードは、マルチスレッドを理解している開発者によるコードレビューの下でのみ変更されるようにチェックを入れてください。

あなたは次のようになり code rule over a LINQ query (CQLinq)書くことができ NDepend
+0

"より複雑な同期コードは、マルチスレッドを理解する開発者によるコードレビューの下でしか修正されていないことを確認してください。"実際にはプロセス/フロー/人員がないため、各変更を検証します。われわれは間違いがないことを確かめるだけで正確さを徹底しようとはしていない。 –

1

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 EnterまたはExitを呼び出すことなく、意志を。これは正確にあなたが求めているものではありません。バーに明白にロックを入れたいからですが、これは単純で非常に近いです。あなたもFOO上の特定の書き込み/アサインフィールドの使用を制限するために... ...

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

を書くことができます

ノート。

+0

NDependは生成されたILを返しますが、対応するC#コードは使用できません。したがって、Monitorクラスに対する検証。 –

+0

確かにVincentですが、NDependはC#とC#Cyclomatic Complexityメトリックも解析します。http://www.ndepend.com/Doc_CI_Inputs.aspx –

関連する問題