32

FxCop は、複合語であるため、Username を大文字の N (つまり UserName) で綴るように求めています。ただし、一貫性の理由から、小文字の n で綴る必要があるため、username または Username のいずれかになります。

次のセクションをセクションに追加して、CodeAnalysisDictionary.xml を調整してみました。

<DiscreteExceptions>
  <Term>username</Term>
</DiscreteExceptions>

カスタム辞書がどのように機能するかを理解していることから、これは FxCop にユーザー名を個別の用語として扱い、CompoundWordsShouldBeCasedCorrectly (CA1702) チェックがエラーを発生させないようにする必要があります。

残念ながら、これは機能しません。その理由とこれを解決する方法を知っている人はいますか? 抑制を追加したくありません。これは、発生回数が非常に多いため、GlobalSuppressions ファイルがひどく乱雑になるためです。

追加するために編集:当分の間、GlobalSuppressions を使用してこれを解決しましたが、問題の性質を考えると、これはこれを解決する理想的な方法とは思えません。FxCop が辞書で定義されたルールをどのように適用するかについての詳細情報をどこで探すべきかについて、誰かヒントを与えることができますか?

4

2 に答える 2

33

私は FxCop / マネージド コード分析チームで 3 年間開発者を務めていました。私の時代から状況が変わり、カスタム辞書の処理がどのように機能するかを正確に忘れていたため、これを理解するのにかなりの時間がかかりました. :)

エグゼクティブサマリー

簡単に言えば、C:\Program Files (x86)\Microsoft FxCop 1.36\CustomDictionary.xml からユーザー名、ユーザー名、UserName、および UserNames へのすべての参照を削除する必要があるということです。

通常、これは必須ではないためお勧めしませんが、バグであると思われるものを見つけたので、これが唯一の回避策です。

フルストーリー

わかりました、長い答えのために...

ルールには、次のように機能する 2 つの異なるチェックがあります。

A. 個別であるべき複合語をチェックする

  1. 識別子をトークンに分割: 例FileName --> { "file", "name" }
  2. 隣接するトークンのペアごとにスペル チェックを行います。
  3. スペル チェックが成功した場合 (たとえばfilename、有効な単語と見なされた場合)、
    1 つの単語は 2 つのトークンとして表現されるべきではないため、潜在的な問題が見つかりました。
  4. ただし、カスタム ディクショナリ<Term CompoundAlternate="FileName">filename</Term> のセクションに a がある場合、それは単語ですが、デザイン ガイドラインを意味するものと見なされます (主に、ルールが存在する前のフレームワークの先行技術との一貫性への同意として)。と書かれるべきだと主張しているので、警告を抑制しなければなりません。<Compound>filenameFileName
  5. また、ユーザー辞書<Term>filename</Term>のセクションにエントリがある場合<DiscreteExceptions> 、'filename' は単語ですが、別のコンテキストでは 'file' と 'name' の 2 つの単語である可能性があることを意味すると見なされます。たとえば、開始は単語ですが、ユーザーに変更DoSomethingOnSetを 求めるのはDoSomethingOnsetノイズになるため、警告を抑制しなければなりません。

B.複合語にする必要がある個別の単語を確認します。

  1. A.1 からトークンを取得し、カスタム ディクショナリ内の一連の複合用語に対して各トークンを個別にチェックします。
  2. 一致する場合は、ステップ A.4 の解釈に従って警告する必要があります。

warning: Usernameshould beUserNameがパート B で検出されることに注意してください。これは DiscreteExceptions セクションを参照しないため、そのセクションを変更しても警告を抑制することができません。問題は、デフォルトのカスタム ディクショナリに、 の正しい大文字と小文字の区別usernameが alwaysであるというエントリがあることUserNameです。何らかの形で削除またはオーバーライドする必要があります。

不具合

理想的な解決策は、既定のユーザー辞書をそのままにSearchFxCopDir=falseして、プロジェクト ファイルで指定し、プロジェクトに使用する CustomDictionary.xml で必要な既定のユーザー辞書の部分のみをマージすることです。残念ながら、FxCop 1.36 は SearchFxCopDir ディレクティブを無視し、常に true として扱うため、これは機能しません。これはバグだと思いますが、ディレクティブが文書化されておらず、対応する UI がないため、意図的な変更である可能性もあります。正直わからない…

結論

FxCop は常にプロジェクト ユーザー辞書に加えて既定のユーザー辞書を使用するため、問題のエントリを既定のユーザー辞書から削除するしかありません。

機会があれば、現在のコード分析チームに連絡して、これが実際にバグであるかどうかを確認し、ここで報告します...

于 2010-01-12T07:27:01.593 に答える
4

FxCop に付属しているカスタム辞書 (私のシステムではC:\Program Files\Microsoft FxCop 1.36\CustomDixtionary.xmlにありますが、YMMV にあります) の Words\Compounds に<Term CompoundAlternate="UserName">username</Term>エントリがあります。消して。個別の例外がまだ必要です。

于 2010-01-12T06:24:06.253 に答える