コード品質規則
.NET コード分析には、コードの品質向上を目的とした規則が用意されています。 規則は、デザイン、グローバリゼーション、パフォーマンス、セキュリティなどの区分に分類されています。 特定の規則は .NET API の使用に固有であり、他の規則は一般的なコードの品質に関するものです。
規則のインデックス
次の表に、コード品質分析規則の一覧を示します。
規則 ID と警告 | 説明 |
---|---|
CA1000:ジェネリック型の静的メンバーを宣言しません | ジェネリック型の静的メンバーを呼び出すときには、その型の型引数も指定する必要があります。 推論をサポートしないジェネリック インスタンス メンバーを呼び出すときには、そのメンバーに型引数を指定する必要があります。 この 2 つの場合、型引数を指定するときに使用される構文は異なりますが、混同される可能性があります。 |
CA1001:破棄可能なフィールドを所有する型は、破棄可能でなければなりません | クラスが System.IDisposable 型であるインスタンス フィールドを宣言および実装していますが、IDisposable を実装していません。 IDisposable フィールドを宣言するクラスは間接的にアンマネージ リソースを所有しているため、IDisposable インターフェイスを実装する必要があります。 |
CA1002:ジェネリック リストを公開しません | System.Collections.Generic.List<(Of <(T>)>) は継承ではなくパフォーマンスを目的としたジェネリック コレクションです。 このため、List には仮想メンバーは含まれません。 代わりに、継承を目的としたジェネリック コレクションを公開する必要があります。 |
CA1003:汎用イベント ハンドラーのインスタンスを使用します | 型に void を返すデリゲートが含まれており、デリゲートのシグネチャに 2 つのパラメーター (1 つはオブジェクト、もう 1 つは EventArgs に割り当て可能な型) が含まれ、包含アセンブリの対象が Microsoft .NET Framework 2.0. です。 |
CA1005:ジェネリック型でパラメーターを使用しすぎないでください | ジェネリック型に含まれる型パラメーターが増えれば増えるほど、それぞれの型パラメーターが表す意味を調べることや覚えることが難しくなります。 通常、List<T> のように型パラメーターが 1 つの場合や、Dictionary<TKey, TValue> のように型パラメーターが 2 つの場合、意味は明確です。 しかし、型パラメーターが 3 つ以上になると、ほとんどのユーザーには意味を把握することが困難になります。 |
CA1008:Enums は 0 値を含んでいなければなりません | 初期化されていない列挙型の既定値は、他の値型と同様に、ゼロです。 フラグではない属性が付いた列挙型では、ゼロの値を使用してメンバーを定義する必要があります。これは、既定値を有効な列挙値にするためです。 FlagsAttribute 属性を適用した列挙型でゼロ値のメンバーを定義する場合、名前を "None" にして、列挙型に設定済みの値がないことを示します。 |
CA1010:コレクションは、ジェネリック インターフェイスを実装しなければなりません | コレクションの操作性を拡充するために、ジェネリック コレクション インターフェイスの 1 つを実装します。 これにより、コレクションを使用してジェネリック コレクション型を設定できます。 |
CA1012: 抽象型にはパブリック コンストラクターを含めない | 抽象型上のコンストラクターは、派生型からのみ呼び出すことができます。 パブリック コンストラクターで型のインスタンスが作成され、抽象型のインスタンスは自分で作成できないため、パブリック コンストラクターが含まれる抽象型のデザインは不適切になります。 |
CA1014:アセンブリに CLSCompliantAttribute を設定します | 共通言語仕様 (CLS) には、名前付けの制約、データ型、および規則が定義されています。アセンブリを複数のプログラミング言語で使用する場合、この仕様に準拠する必要があります。 すべてのアセンブリに CLSCompliantAttribute を使用して、CLS への準拠を明示することをお勧めします。 この属性が使用されていないアセンブリは、CLS に準拠しません。 |
CA1016:アセンブリに AssemblyVersionAttribute を設定します | .NET では、バージョン番号を使用してアセンブリを一意に識別し、厳密な名前を持つアセンブリの型にバインドします。 バージョン番号は、バージョンと発行者のポリシーと共に使用されます。 既定で、アプリケーションは、ビルドされたアセンブリのバージョンでのみ実行されます。 |
CA1017:アセンブリに ComVisibleAttribute を設定します | ComVisibleAttribute 属性によって、COM クライアントからマネージド コードにアクセスする方法が決まります。 アセンブリで COM の参照範囲を明示することをお勧めします。 COM の参照範囲は、アセンブリ全体に設定し、個々の型と型のメンバー用にオーバーライドできます。 この属性がない場合、アセンブリのコンテンツは COM クライアントから参照できます。 |
CA1018:属性を AttributeUsageAttribute に設定します | カスタム属性を定義する場合、AttributeUsageAttribute を使用してマークし、カスタム属性を適用できるソース コードの位置を示します。 属性の意味と用途によって、コード内の有効な位置が決まります。 |
CA1019:属性引数にアクセサーを定義します | 属性では、対象に適用するときに必ず指定する必須の引数を定義できます。 この引数は、コンストラクターに位置指定パラメーターで属性を指定できるようになるため、位置指定引数とも呼ばれます。 必須のすべての引数について、対応する読み取り専用のプロパティも属性で規定する必要があります。これは、引数値を実行時に取得できるようにするためです。 また、属性ではオプションの引数も定義できます。これは名前付き引数とも呼ばれます。 この引数は、名前でコンストラクターに属性を指定するときに使用されます。また、対応する読み取り/書き込みプロパティが必要です。 |
CA1021:out パラメーターを使用しません | (out または ref を使用した) 型の参照渡しには、ポインターの使用経験、値型と参照型の違いの理解、および複数の戻り値を持つメソッドの処理が必要です。 また、out パラメーターと ref パラメーターの違いはあまり理解されていません。 |
CA1024:適切な場所にプロパティを使用します | パブリック メソッドまたはプロテクト メソッドに、"Get" で始まる名前が付けられ、パラメーターは使用されていません。また、配列ではない値を返します。 このメソッドは、プロパティに変更できる可能性があります。 |
CA1027:列挙型を FlagsAttribute に設定します | 列挙型は、関連する名前付き定数が複数定義された値型です。 名前付き定数を有意に結合できる場合、列挙型に FlagsAttribute を適用します。 |
CA1028:列挙ストレージは Int32 でなければなりません | 列挙型は、関連する名前付き定数が複数定義された値型です。 既定で、System.Int32 データ型は、定数値を格納するために使用されます。 この基になる型を変更できる場合でも、ほとんどの場合、変更する必要はなく、推奨もされません。 |
CA1030:適切な場所にイベントを使用します | この規則では、通常はイベントに使用される名前を持つメソッドを検出します。 明示的に定義された状態変化に応答してメソッドが呼び出される場合、メソッドはイベント ハンドラーから呼び出す必要があります。 メソッドを呼び出すオブジェクトは、メソッドを直接呼び出すのではなく、イベントを発生させる必要があります。 |
CA1031:一般的な例外の種類はキャッチしません | 汎用的な例外はキャッチしないでください。 より具体的な例外をキャッチするか、汎用的な例外を catch ブロックの最後のステートメントでスローし直します。 |
CA1032:標準例外コンストラクターを実装します | コンストラクターを完全に宣言していないと、例外を正しく処理するのが困難になります。 |
CA1033:インターフェイス メソッドは、子型によって呼び出し可能でなければなりません | シールされていない外部から参照できる型によって、パブリック インターフェイスを持つメソッドを明示的に実装しています。また、同じ名前を持つ外部から参照できる代替のメソッドがありません。 |
CA1034:入れ子にされた型を参照可能にすることはできません | 入れ子にされた型とは、別の型のスコープ内で宣言された型のことです。 入れ子にされた型は、包含型のプライベート実装の詳細をカプセル化するときに便利です。 このような用途なので、入れ子にされた型は外部から参照できないようにします。 |
CA1036:比較可能な型でメソッドをオーバーライドします | パブリック型またはプロテクト型で System.IComparable インターフェイスを実装しています。 これによって、Object.Equals はオーバーライドされません。また、"等しい"、"等しくない"、"未満"、"より大きい" を示す言語固有の演算子はオーバーロードされません。 |
CA1040:空のインターフェイスは使用しません | インターフェイスには、動作や使用のコントラクトを実現するメンバーが定義されます。 インターフェイスで示される機能は、継承の階層構造内に型が存在するかどうかにかかわらず、どの型からも適用できます。 型ではインターフェイスのメンバーに実装することで、インターフェイスが実装されます。 空のインターフェイスではメンバーが定義されません。そのため、実装できるコントラクトも定義されません。 |
CA1041:ObsoleteAttribute メッセージを指定します | 型またはメンバーが System.ObsoleteAttribute 属性を使用してマークされていますが、この属性で ObsoleteAttribute.Message プロパティが指定されていません。 ObsoleteAttribute でマークされている型またはメンバーをコンパイルすると、属性の Message プロパティが表示されます。 これによって、ユーザーは旧式の型またはメンバーに関する情報を知ることができます。 |
CA1043:インデクサーには整数または文字列引数を使用します | インデクサー (つまり、インデックスされたプロパティ) では、インデックスに整数型または文字列型を使用します。 一般に、このような型はデータ構造のインデックス作成に使用され、ライブラリの操作性も改善されます。 Object 型の使用は、デザイン時に特定の整数型または文字列型を指定できない場合に限定してください。 |
CA1044:プロパティを書き込み専用にすることはできません | 読み取り専用のプロパティは許容され、必要な場合もよくありますが、書き込み専用のプロパティを使用することはデザインのガイドラインで禁止されています。 これは、値を設定できてもその値を参照できず、セキュリティが確保されないためです。 また、読み取りアクセスがないと、共有オブジェクトのステータスを参照できないため、実用性が制限されます。 |
CA1045:型を参照によって渡しません | (out または ref を使用した) 型の参照渡しには、ポインターの使用経験、値の型と参照型の違いの理解、および複数の戻り値を持つメソッドの処理が必要です。 開発者全般に向けてライブラリをデザインする場合、ユーザーが out パラメーターまたは ref パラメーターの扱い方を習得することは期待しないでください。 |
CA1046:参照型で、演算子 equals をオーバーロードしないでください | 参照型の場合、等値演算子は既定の実装でほぼ問題がありません。 既定で、2 つの参照が等値と見なされるのは、同じオブジェクトを参照する場合のみです。 |
CA1047:シールド型の保護されたメンバーを宣言しません | 型でプロテクト メンバーを宣言するのは、継承する型からメンバーにアクセスまたはオーバーライドできるようにするためです。 定義により、シールされた型から継承することはできません。これは、シールされた型のプロテクト メソッドを呼び出すことができないということを意味します。 |
CA1050:名前空間で型を宣言します | 型を名前空間内で宣言するのは、名前が衝突しないようにするためと、関連する型をオブジェクト階層形式で編成するためです。 |
CA1051:参照可能なインスタンス フィールドを宣言しません | フィールドの主な用途は、実装の詳細にする必要があります。 フィールドは private または internal にし、プロパティによって公開するようにします。 |
CA1052:スタティック ホルダー型はシールドされていなければなりません | パブリック型またはプロテクト型に静的メンバーしかなく、sealed (C# リファレンス) (NotInheritable) 修飾子を使用して宣言されていません。 継承を意図していない型は、sealed 修飾子を使用してマークし、基本型として使用できないようにします。 |
CA1053:スタティック ホルダー型はコンストラクターを含むことはできません | パブリック型または入れ子になったパブリック型で、静的なメンバーのみが宣言されています。また、パブリックまたはプロテクトの既定のコンストラクターが含まれます。 静的メンバーの呼び出しに型のインスタンスは必要ないため、コンストラクターは不要です。 安全性とセキュリティを確保するために、文字列引数を使用して文字列オーバーロードで URI (Uniform Resource Identifier) オーバーロードを呼び出してください。 |
CA1054:URI パラメーターを文字列にすることはできません | メソッドで URI の文字列形式を使用する場合、対応するオーバーロードを宣言し、URI クラスのインスタンスを使用します。こうすることで、安全な方法でこのサービスを実現できます。 |
CA1055:URI 戻り値を文字列にすることはできません | この規則では、メソッドは URI を返すと想定されます。 URI の文字列表現は解析エラーやエンコーディング エラーが発生しやすく、セキュリティ上の脆弱性の原因となる場合があります。 System.Uri クラスを使用すると、安全な方法でこのサービスを実現できます。 |
CA1056:URI プロパティを文字列にすることはできません | この規則では、プロパティは URI (Uniform Resource Identifier) を表すと想定されます。 URI の文字列表現は解析エラーやエンコーディング エラーが発生しやすく、セキュリティ上の脆弱性の原因となる場合があります。 System.Uri クラスを使用すると、安全な方法でこのサービスを実現できます。 |
CA1058:型は、一定の基本型を拡張することはできません | 外部から参照可能な型では、特定の基本型が拡張されます。 別の型を使用してください。 |
CA1060: P/Invoke を NativeMethods クラスに移動します | System.Runtime.InteropServices.DllImportAttribute 属性でマークされているメソッドなどのプラットフォーム呼び出しメソッド、または Visual Basic で Declare キーワードを使用して定義されたメソッドから、アンマネージド コードにアクセスしています。 これらのメソッドは、NativeMethods、SafeNativeMethods、UnsafeNativeMethods の各クラスのいずれかに含まれる必要があります。 |
CA1061:基底クラス メソッドを非表示にしません | 派生メソッドのパラメーター シグネチャ内のある型が、基本メソッドのパラメーター シグネチャ内のそれに対応する型より弱く型指定されていることが、両者の唯一の相違点である場合、基本型内のメソッドが派生型内の同じ名前のメソッドによって隠ぺいされます。 |
CA1062:パブリック メソッドの引数の検証 | 外部から参照可能なメソッドに渡されるすべての参照引数について、null かどうかをチェックする必要があります。 |
CA1063:IDisposable を正しく実装します | すべての IDisposable 型は、Dispose パターンを適切に実装する必要があります。 |
CA1064:例外は public として設定する必要があります | 内部例外は、その内部スコープ内でのみ認識されます。 内部スコープの外側にある例外は、基本例外を使用しなければキャッチできません。 内部例外が Exception、SystemException、または ApplicationException を継承している場合、外部コードはその例外の処理に関する十分な情報を取得できません。 |
CA1065:予期しない場所に例外を発生させません | 例外をスローしないはずのメソッドが例外をスローします。 |
CA1066: Equals をオーバーライドする際に IEquatable を実装します | 値の型では、Equals をオーバーライドしていますが、IEquatable<T>を実装していません。 |
CA1067: IEquatable を実装するときに Equals をオーバーライドします | 型では IEquatable<T> を実装していますが、Equals メソッドをオーバーライドしていません。 |
CA1068:CancellationToken パラメーターは最後に指定する必要があります | メソッドに、最後のパラメーターではない CancellationToken パラメーターが指定されています。 |
CA1069: 列挙型には重複する値を指定できません | 列挙型に、同じ定数値が明示的に割り当てられている複数のメンバーがあります。 |
CA1070: イベント フィールドを virtual として宣言しません | フィールドのように使用するイベントが virtual として宣言されました。 |
CA1200:プレフィックスで cref タグを使用しません | XML ドキュメント タグの cref 属性は "コード参照" を意味します。 タグの内部テキストが、型、メソッド、プロパティなど、コード要素であることを指定します。
cref タグとプレフィックスを一緒に使用すると、コンパイラで参照を検証できなくなるため、一緒に使用しないでください。 また、Visual Studio 統合開発環境 (IDE) でリファクタリング中にこれらのシンボル参照を見つけたり、更新したりすることもできなくなります。 |
CA1303:ローカライズされるパラメーターとしてリテラルを渡さない | 外部から参照できるメソッドで、.NET コンストラクターまたはメソッドへのパラメーターとして、リテラル文字列を渡しています。その文字列はローカライズ可能です。 |
CA1304:CultureInfo を指定します | System.Globalization.CultureInfo パラメーターを受け入れるオーバーロードを持つメンバーを呼び出しているメソッドまたはコンストラクターが、CultureInfo パラメーターを使用するオーバーロードを呼び出していません。 CultureInfo オブジェクトまたは System.IFormatProvider オブジェクトが指定されない場合、オーバーロードされたメンバーから提示された既定値は、すべてのロケールに効果が及ばない可能性があります。 |
CA1305:IFormatProvider を指定します | System.IFormatProvider パラメーターを受け入れるオーバーロードを持つメンバーを 1 つ以上呼び出しているメソッドまたはコンストラクターが、IFormatProvider パラメーターを使用するオーバーロードを呼び出していません。 System.Globalization.CultureInfo オブジェクトまたは IFormatProvider オブジェクトが指定されない場合、オーバーロードされたメンバーから提示された既定値は、すべてのロケールに効果が及ばない可能性があります。 |
CA1307:意味を明確にするための StringComparison の指定 | 文字列比較演算で、StringComparison パラメーターを設定しないメソッド オーバーロードが使用されています。 |
CA1308:文字列を大文字に標準化します | 文字列は大文字に正規化する必要があります。 小文字への変換時に 1 つの小さい文字グループをラウンド トリップさせることができません。 |
CA1309:順序を示す StringComparison を使用します | 非言語的な文字列比較演算で、StringComparison パラメーターが Ordinal または OrdinalIgnoreCase に設定されていません。 パラメーターを StringComparison.Ordinal または StringComparison.OrdinalIgnoreCase に明示的に設定することによって、多くの場合、コードの速度、正確さ、および信頼性が向上します。 |
CA1310:正確な StringComparison の指定 | 文字列比較演算で、StringComparison パラメーターが設定されておらず、カルチャ固有の文字列比較が既定で使用されるメソッド オーバーロードを使用しています。 |
CA1311: カルチャの指定またはインバリアント バージョンの使用 | カルチャを指定するか、インバリアント カルチャを使用すると、ToUpper または ToLower を呼び出すときに、現在のカルチャへの暗黙的な依存を回避できます。 |
CA1401: P/Invoke は参照可能になりません | パブリック型のパブリック メソッドまたはプロテクト メソッドに、System.Runtime.InteropServices.DllImportAttribute 属性があります (Visual Basic では Declare キーワードでも実装されます)。 このようなメソッドは公開しないでください。 |
CA1416:プラットフォームの互換性を検証する | プラットフォーム依存 API をコンポーネント上で使用すると、一部のプラットフォームでコードが動作しなくなります。 |
CA1417: P/Invokes の文字列パラメーターに OutAttribute を使用しません |
文字列がインターン処理された文字列で、文字列パラメーターが OutAttribute の値で渡された場合、ランタイムが不安定になる可能性があります。 |
CA1418: 有効なプラットフォーム文字列を使用する | プラットフォーム互換性アナライザーには、有効なプラットフォーム名とバージョンが必要です。 |
CA1419: 'System.Runtime.InteropServices.SafeHandle' から派生した具象型の包含型と同じように表示されるパラメーターなしのコンストラクターを指定します |
System.Runtime.InteropServices.SafeHandle から派生した型の包含型と同じように見えるパラメーターなしのコンストラクターを指定すると、ソース生成相互運用ソリューションのパフォーマンスと使用方法が向上します。 |
CA1420: プロパティ、型、または属性にはランタイム マーシャリングが必要です | ランタイム マーシャリングが無効になっているときにランタイム マーシャリングを必要とする機能を使用すると、実行時例外が発生します。 |
CA1421: DisableRuntimeMarshallingAttribute が適用されている場合、メソッドはランタイム マーシャリングを使用します | メソッドにランタイム マーシャリングを使い、ランタイム マーシャリングは明示的に無効にします。 |
CA1422: プラットフォームの互換性を検証する | 特定の OS (バージョン) で古い API を、その OS (バージョン) から到達可能な呼び出しサイトから呼び出すことはお勧めしません。 |
CA1501:継承を使用しすぎないでください | 型が、その継承階層内の 5 つ以上深いレベルにあります。 深いレベルで入れ子にされた型の確認、理解、および保守は困難です。 |
CA1502:メソッドの実装を複雑にしすぎないでください | この規則は、線形独立のメソッド経路数を示す尺度で、条件分岐の数と複雑さによって決まります。 |
CA1505:メンテナンスできないコードを使用しないでください | 型またはメソッドの保守容易性指数が低い値です。 保守容易性指数の低い型またはメソッドは、保守が困難な可能性があるため、デザインの変更を検討することをお勧めします。 |
CA1506:クラス結合度を大きくしすぎないでください | この規則は、型またはメソッドに含まれる一意の型参照の数をカウントすることによって、クラス結合度を計測します。 |
CA1507:文字列の代わりに nameof を使用します |
nameof 式を使用できる場合に、文字列リテラルが引数として使用されています。 |
CA1508:使用されない条件付きコードを回避する | 実行時に常に true または false と評価される条件付きコードがメソッドにあります。 このため、条件の false 分岐で実行されないコードになります。 |
CA1509: コード メトリック構成ファイルのエントリが無効です |
CA1501、CA1502、CA1505、CA1506 などのコード メトリック規則で、無効なエントリを含んだ CodeMetricsConfig.txt という名前の構成ファイルが指定されました。 |
CA1510: ArgumentNullException スロー ヘルパーを使用する | スロー・ヘルパーは、新しい例外インスタンスを構築する if ブロックよりもシンプルで効率的です。 |
CA1511: ArgumentException スロー ヘルパーを使用する | スロー・ヘルパーは、新しい例外インスタンスを構築する if ブロックよりもシンプルで効率的です。 |
CA1512: ArgumentOutOfRangeException throw ヘルパーを使用する | スロー・ヘルパーは、新しい例外インスタンスを構築する if ブロックよりもシンプルで効率的です。 |
CA1513: ObjectDisposedException スロー ヘルパーを使用する | スロー・ヘルパーは、新しい例外インスタンスを構築する if ブロックよりもシンプルで効率的です。 |
CA1514: 冗長な長さの引数を使用しなようにしてください | 冗長な長さの引数は、文字列またはバッファーの末尾にスライスする場合に使用されます。 計算された長さはエラーが発生しやすく、不要でもあります。 |
CA1515: public 型を internal にすることを検討する | クラス ライブラリとは異なり、通常、アプリケーションの API はパブリックに参照されないため、型を internal としてマークできます。 |
CA1700:列挙型値に 'Reserved' という名前を指定しません | この規則では、"reserved" を含む名前の列挙体のメンバーは、現在使用されていなくても、将来的なバージョンでは名前を変更するか削除されるプレースホルダーと想定しています。 メンバーの名前変更や削除は、互換性に影響する変更点です。 |
CA1707:識別子はアンダースコアを含むことはできません | 名前付け規則では、識別子名にアンダースコア (_) 文字を含めることができません。 この規則により、名前空間、型、メンバー、およびパラメーターがチェックされます。 |
CA1708:識別子は、大文字と小文字の区別以外にも相違していなければなりません | 名前空間、型、メンバー、およびパラメーターの各識別子は、大文字/小文字以外のみでは区別できません。共通言語ランタイムを対象とする言語は、大文字と小文字を区別する必要はないためです。 |
CA1710:識別子は、正しいサフィックスを含んでいなければなりません | 名前付け規則によると、特定の基本型を拡張した型、特定のインターフェイスを実装する型、またはそのような型の派生型は、基本型やインターフェイスに関連するサフィックスを名前に付けます。 |
CA1711:識別子は、不適切なサフィックスを含むことはできません | 規則では、特定の基本型を拡張する型、特定のインターフェイスを実装する型、またはそのような型から派生した型の名前にのみ、固有の予約済みサフィックスを末尾に付けます。 その他の型名では、予約済みのサフィックスを使用しないでください。 |
CA1712:列挙型値を型名のプレフィックスにしません | 型情報は開発ツールで表示されるため、列挙型のメンバー名には、型名のプレフィックスを付けません。 |
CA1713:イベントは、before または after プレフィックスを含むことはできません | イベント名が "Before" または "After" で始まっています。 特定のシーケンスで発生する関連イベントに名前を付ける場合、現在時制または過去時制を使用して、アクション シーケンスの相対的な位置を示します。 |
CA1714:フラグ列挙型は、複数形の名前を含んでいなければなりません | パブリック列挙体に System.FlagsAttribute 属性があり、その名前の末尾に "s" がありません。 FlagsAttribute でマークされた型は複数形の名前を持ちます。これは、この属性が複数の値を指定できることを示すからです。 |
CA1715:識別子は正しいプレフィックスを含んでいなければなりません | 外部から参照できるインターフェイスの名前が大文字の "I" から始まっていません。 外部から参照できる型またはメソッドのジェネリック型パラメーターの名前が、大文字の "T" から始まっていません。 |
CA1716:識別子はキーワードと同一にすることはできません | 名前空間の名前または型の名前が、プログラミング言語で、予約済みのキーワードと一致します。 名前空間と型の識別子は、共通言語ランタイムを対象にする言語で定義されているキーワードと一致しないようにします。 |
CA1717:FlagsAttribute 列挙型のみが複数形の名前を含んでいなければなりません | 名前付け規則では、列挙体の複数形の名前は同時に複数の列挙値を指定できることを意味します。 |
CA1720:識別子には型名を含めないでください | 外部から参照できるメンバーのパラメーター名にデータ型の名前が含まれているか、外部から参照できるメンバーの名前に言語固有のデータ型の名前が含まれています。 |
CA1721:プロパティ名は get メソッドと同一にすることはできません | パブリック メンバーまたはプロテクト メンバーの名前が、"Get" から始まっているか、パブリック プロパティまたはプロテクト プロパティの名前と一致します。 "Get" メソッドとプロパティには、それぞれの機能を明確に区別する名前を指定しなければなりません。 |
CA1724:型名は名前空間と同一にすることはできません | 型名は .NET 名前空間と同一にすることはできません。 この規則に違反すると、ライブラリが使いづらくなります。 |
CA1725:パラメーター名は基本宣言と同一でなければなりません | オーバーライド階層のパラメーターに対する一貫性のある名前付けによって、メソッド オーバーライドの有用性が高まります。 派生メソッドのパラメーター名が基本宣言のパラメーター名と異なる場合、メソッドが基本メソッドのオーバーライドであるか、またはメソッドの新しいオーバーライドであるかについて混乱が生じる可能性があります。 |
CA1727: 名前付きプレースホルダーに PascalCase を使用してください | ログ メッセージ テンプレートの名前付きプレースホルダーにはパスカルケースを使用します。 |
CA1801:使用されていないパラメーターの確認 | メソッドのシグネチャに、メソッドの本体で使用されていないパラメーターがあります。 |
CA1802:適切な場所にリテラルを使用します | フィールドが static および read-only (Visual Basic では Shared および ReadOnly) として宣言され、コンパイル時に計算できる値によって初期化されています。 対象フィールドに代入された値はコンパイル時に計算できるので、宣言を const (Visual Basic では Const) フィールドに変更して、値が実行時ではなくコンパイル時に計算されるようにします。 |
CA1805: 不必要に初期化しない | .NET ランタイムでは、コンストラクターを実行する前に参照型のすべてのフィールドを既定値に初期化します。 ほとんどの場合、フィールドを既定値に明示的に初期化することは冗長であるため、メンテナンス コストが増加し、パフォーマンスが低下する可能性があります (アセンブリ サイズの増加など)。 |
CA1806:メソッドの結果を無視しない | 新しく作成されたオブジェクトが現在まで使用されていないか、新しい文字列を作成して返すメソッドが呼び出されて作成された新しい文字列が現在まで使用されていません。あるいは、COM または P/Invoke メソッドから返された HRESULT またはエラー コードが現在まで使用されていません。 |
CA1810:参照型の静的フィールドをインラインで初期化します | 型で明示的な静的コンストラクターを宣言すると、Just-In-Time (JIT) コンパイラが、静的コンストラクターが呼び出されたことを確認するために、型の静的メソッドと静的インスタンス コンストラクターに個別にチェックを追加します。 静的コンストラクターのチェックによってパフォーマンスが低下することがあります。 |
CA1812:インスタンス化されていない内部クラスを使用しません | アセンブリ レベルの型のインスタンスが、アセンブリ内のコードから作成されません。 |
CA1813:アンシールド属性を使用しません | .NET には、カスタム属性を取得するメソッドが用意されています。 既定では、これらのメソッドで属性の継承階層が検索されます。 属性をシールすると、継承階層の全体が検索されなくなるため、パフォーマンスが向上します。 |
CA1814:複数次元の配列ではなくジャグ配列を使用します | ジャグ配列とは、その要素も配列である配列です。 要素を構成する配列のサイズは異なってもよいため、データ セットによっては無駄な空間が少なくなります。 |
CA1815:equals および operator equals を値型でオーバーライドします | 値型の場合、Equals を継承した実装が Reflection ライブラリを使用して、すべてのフィールドの内容を比較します。 Reflection は計算コストが高いため、場合によってはすべてのフィールドで等値性を比較する必要はありません。 ユーザーがインスタンスの比較または並べ替えを行うことや、ハッシュ テーブル キーとしてインスタンスを使用することが予想される場合には、値型に Equals を実装する必要があります。 |
CA1816:GC.SuppressFinalize を正しく呼び出します | Dispose を実装するメソッドが GC.SuppressFinalize を呼び出していないか、Dispose を実装しないメソッドが GC.SuppressFinalize を呼び出しています。または、あるメソッドが GC.SuppressFinalize を呼び出し、this (Visual Basic では Me) 以外のオブジェクトを渡しています。 |
CA1819:プロパティは、配列を返すことはできません | プロパティが読み取り専用であっても、プロパティで返される配列は書き込みから保護されません。 配列の改ざんを防ぐには、プロパティで配列のコピーを返す必要があります。 一般に、このようなプロパティを呼び出すときのパフォーマンス低下は理解されません。 |
CA1820:文字列の長さを使用して空の文字列をテストします | String.Length プロパティまたは String.IsNullOrEmpty メソッドを使用して文字列を比較する方法は、Equals を使用する場合よりもはるかに高速です。 |
CA1821:空のファイナライザーを削除します | オブジェクトの有効期間の追跡に関連するパフォーマンス オーバーヘッドが増大するため、ファイナライザーは可能な限り使用しないでください。 空のファイナライザーを使用すると、オーバーヘッドが増大するだけで何の利点もありません。 |
CA1822:メンバーを static に設定します | インスタンス データにアクセスしない、またはインスタンス メソッドを呼び出さないメンバーは、静的 (Visual Basic では Shared) としてマークできます。 メソッドを静的としてマークすると、コンパイラはこれらのメンバーに対する非仮想呼び出しサイトを出力します。 パフォーマンス重視のコードでは、これにより大きくパフォーマンスを向上できます。 |
CA1823:使用されていないプライベート フィールドを使用しません | アセンブリ内でアクセスされていないと思われるプライベート フィールドが検出されました。 |
CA1824:アセンブリを NeutralResourcesLanguageAttribute に設定します | NeutralResourcesLanguage 属性は、リソース マネージャーに対し、アセンブリのニュートラル カルチャのリソースを表示するために使用した言語を通知します。 これにより、読み込んだ最初のリソースに対する検索のパフォーマンスが向上し、ワーキング セットを縮小できます。 |
CA1825:長さ 0 の配列割り当てを回避します | 長さ 0 の配列を初期化すると、不要なメモリ割り当てが発生します。 代わりに、Array.Empty を呼び出して、静的に割り当てられた空の配列インスタンスを使用してください。 メモリ割り当ては、このメソッドのすべての呼び出しで共有されます。 |
CA1826:Linq の列挙可能なメソッドの代わりにプロパティを使用します | Enumerable LINQ メソッドが同等のより効率的なプロパティをサポートする型で使用されました。 |
CA1827:Any が使用できる場合は Count/LongCount を使用しません | Count メソッドの方が効率的な状況で、LongCount または Any メソッドが使用されました。 |
CA1828:AnyAsync が使用できる場合は CountAsync/LongCountAsync を使用しません | CountAsync メソッドの方が効率的な状況で、LongCountAsync または AnyAsync メソッドが使用されました。 |
CA1829:Enumerable. Count メソッドではなく Length/Count プロパティを使用します |
Count LINQ メソッドが同等のより効率的な Length または Count プロパティをサポートする型で使用されました。 |
CA1830:StringBuilder の厳密に型指定された Append および Insert メソッドのオーバーロードをお勧めします | Append と Insert では、String 以外の複数の型に対してオーバーロードを提供します。 可能であれば、ToString() と文字列ベースのオーバーロードを使用するよりも、厳密に型指定されたオーバーロードを優先して使用することをお勧めします。 |
CA1831: 該当する場合、文字列に範囲ベースのインデクサーの代わりに AsSpan を使用します | 文字列に対して範囲インデクサーを使用し、その値を ReadOnlySpan<char> 型に暗黙的に割り当てると、Substring の代わりにメソッド Slice が使用されます。これにより、文字列の要求された部分のコピーが生成されます。 |
CA1832: 配列の ReadOnlySpan または ReadOnlyMemory 部分を取得するために、範囲ベースのインデクサーの代わりに AsSpan または AsMemory を使用します | 配列に対して範囲インデクサーを使用し、その値を ReadOnlySpan<T> または ReadOnlyMemory<T> 型に暗黙的に割り当てると、GetSubArray の代わりにメソッド Slice が使用されます。これにより、配列の要求された部分のコピーが生成されます。 |
CA1833: 配列の Span または Memory 部分を取得するために、範囲ベースのインデクサーの代わりに AsSpan または AsMemory を使用します | 配列に対して範囲インデクサーを使用し、その値を Span<T> または Memory<T> 型に暗黙的に割り当てると、GetSubArray の代わりにメソッド Slice が使用されます。これにより、配列の要求された部分のコピーが生成されます。 |
CA1834:1 文字の文字列に対して StringBuilder.Append(char) を使用する |
StringBuilder には、引数として Append を取る char オーバーロードがあります。 パフォーマンス上の理由から、char オーバーロードを呼び出すことをお勧めします。 |
CA1835: 'ReadAsync' および 'WriteAsync' で 'Memory' ベースのオーバーロードを優先的に使用します | 'Stream' には、最初の引数として 'Memory<Byte>' を取る 'ReadAsync' オーバーロードと、最初の引数として 'ReadOnlyMemory<Byte>' を取る 'WriteAsync' オーバーロードがあります。 より効率的なメモリ ベースのオーバーロードを呼び出すことをお勧めします。 |
CA1836: 使用可能な場合は、IsEmpty よりも Count を優先します |
オブジェクトに項目が含まれているかどうかを確認するときは、IsEmpty 、Count 、Length 、Count<TSource>(IEnumerable<TSource>) よりも効率的な LongCount<TSource>(IEnumerable<TSource>) プロパティを使用することをお勧めします。 |
CA1837: Environment.ProcessId ではなく Process.GetCurrentProcess().Id を使用します |
Environment.ProcessId は Process.GetCurrentProcess().Id よりも簡単かつ高速です。 |
CA1838: P/Invokes に StringBuilder パラメーターを使用しません |
'StringBuilder' をマーシャリングすると、ネイティブ バッファーのコピーが常に作成され、1 回のマーシャリング操作に対して複数の割り当てが発生します。 |
CA1839: Process.GetCurrentProcess().MainModule.FileName ではなく Environment.ProcessPath を使用します |
Environment.ProcessPath は Process.GetCurrentProcess().MainModule.FileName よりも簡単かつ高速です。 |
CA1840: Thread.CurrentThread.ManagedThreadId ではなく Environment.CurrentManagedThreadId を使用します |
Environment.CurrentManagedThreadId は Thread.CurrentThread.ManagedThreadId よりもコンパクトで効率的です。 |
CA1841: Dictionary Contains メソッドを優先します | 多くの場合、Contains またはKeys コレクションでValues を呼び出すと、ディクショナリ自体でContainsKey またはContainsValue を呼び出すよりもコストが高くなる場合があります。 |
CA1842: 1 つのタスクで 'WhenAll' を使用しない | 1 つのタスクで WhenAll を使用すると、パフォーマンスが低下する可能性があります。 代わりにタスクを待機または返します。 |
CA1843: 1 つのタスクで 'WaitAll' を使用しない | 1 つのタスクで WaitAll を使用すると、パフォーマンスが低下する可能性があります。 代わりにタスクを待機または返します。 |
CA1844: 'Stream' のサブクラス化時に、非同期メソッドのメモリベースのオーバーライドを提供する | パフォーマンス向上のため、'Stream' をサブクラス化するときに、メモリベースの非同期メソッドをオーバーライドします。 次に、メモリベースのメソッドの観点から配列ベースのメソッドを実装します。 |
CA1845: スパンベースの 'string.Concat' を使用します |
AsSpan と連結演算子の代わりに、string.Concat と Substring を使用する方が効率的です。 |
CA1846: AsSpan を Substring より優先します |
AsSpan は Substring よりも効率的です。
Substring が、O(n) 文字列のコピーを行うのに対し、AsSpan はそうせずに、一定のコストがかかります。
AsSpan も、ヒープ割り当てを実行しません。 |
CA1847: 1 文字参照に文字リテラルを使用する | 1 文字を検索するときに String.Contains(char) の代わりに String.Contains(string) を使用します。 |
CA1848: LoggerMessage デリゲートを使用する | パフォーマンスを向上させるには、LoggerMessage デリゲートを使用します。 |
CA1849: 非同期メソッドの場合に非同期メソッドを呼び出す | 既に非同期であるメソッドでは、他のメソッドの呼び出しはその非同期バージョン (存在する場合) に対して行う必要があります。 |
CA1850: 静的メソッドよりも優先 HashData されます ComputeHash |
HashData を呼び出す HashAlgorithm インスタンスを作成および管理するよりも、静的 ComputeHash メソッドを使用する方が効率的です。 |
CA1851: IEnumerable コレクションの複数の列挙体が考えられます |
IEnumerable コレクションの複数の列挙体が考えられます。 複数の列挙を回避する実装の使用を検討してください。 |
CA1852: 内部型をシールする | アセンブリの外部からアクセスできない型で、それに含まれるアセンブリ内にサブタイプがない場合は、シールされません。 |
CA1853: 'Dictionary.ContainsKey(key)' の不要な呼び出し |
Dictionary.Remove(key) で Dictionary.ContainsKey(key) を保護する必要はありません。
Dictionary<TKey,TValue>.Remove(TKey) では、キーが存在するかどうかは既にチェックされており、存在しない場合はスローされません。 |
CA1854: 'IDictionary.TryGetValue(TKey, out TValue)' メソッドを優先する | 'ContainsKey' チェックで保護された Dictionary インデクサー アクセスよりも 'TryGetValue' を優先します。 'ContainsKey' とインデクサーではどちらもキーを検索するため、'TryGetValue' を使用すると余分な参照が回避されます。 |
CA1855: Span<T>.Fill() の代わりに Span<T>.Clear() を使用する | Span<T>.Clear() を呼び出すよりも Span<T>.Fill(T) を呼び出して、スパンの要素に既定値を入力する方が効率的です。 |
CA1856: ConstantExpected 属性の使用が正しくない | ConstantExpectedAttribute 属性がパラメーターに正しく適用されていません。 |
CA1857: 最適なパフォーマンスを得るにはパラメーターに定数が必要 | ConstantExpectedAttribute で注釈が付けられたパラメーターに無効な引数が渡されました。 |
CA1858: IndexOf の代わりに StartsWith を使う | String.StartsWith を呼び出すよりも、String.IndexOf を呼び出して、文字列が特定のプレフィックスで始まるかどうかを確認する方が効率的です。 |
CA1859: パフォーマンスの向上のために可能な場合は具象型を使用する | コードで使用されるインターフェイス型または抽象型によって、不要なインターフェイス呼び出しや仮想呼び出しが発生します。 |
CA1860: 'Enumerable.Any()' 拡張メソッドを使用しない | コレクション型にいずれかの要素があるかどうかを判断するには、Length を呼び出すより、Count 、IsEmpty 、または Enumerable.Any を使う方が効率的で明確です (可能な場合)。 |
CA1861: 引数として定数配列を使用しない | 引数として渡される定数配列は再利用されないため、パフォーマンスのオーバーヘッドを意味します。 パフォーマンス向上のために、それらを "静的な読み取り専用" フィールドに抽出することを検討してください。 |
CA1862: 'StringComparison' メソッドのオーバーロードを使用して大文字と小文字を区別しない文字列比較を実行する | コードから ToLower() または ToUpper() を呼び出して大文字と小文字を区別しない文字列比較を実行すると、不要な割り当てが実行されます。 |
CA1863: 'CompositeFormat' を使用する | 書式設定のコストを削減するには、CompositeFormat インスタンスをキャッシュし、String.Format または StringBuilder.AppendFormat の引数として使います。 |
CA1864: 'IDictionary.TryAdd(TKey, TValue)' メソッドを優先する |
Dictionary<TKey,TValue>.ContainsKey(TKey) と Dictionary<TKey,TValue>.Add は両方とも検索を実行しますが、これは冗長です。
Dictionary<TKey,TValue>.TryAdd を呼び出すと、値が追加されたかどうかを示す bool が返されるため、より効率的です。 キーが既に存在する場合、TryAdd はキーの値を上書きしません。 |
CA1865-CA1867: char オーバーロードを使用します | char オーバーロードは、単一の char を含む文字列のパフォーマンスに優れたオーバーロードです。 |
CA1868: セットに対する 'Contains' の不要な呼び出し | ISet<T>.Add(T) と ICollection<T>.Remove(T) は両方とも検索を実行するため、ICollection<T>.Contains(T) の事前の呼び出しは冗長になります。 Add(T) または Remove(T) を直接呼び出すと、項目が追加されたか削除されたかを示すブール値が返されるため、より効率的です。 |
CA1869: 'JsonSerializerOptions' インスタンスのキャッシュおよび再利用 | シリアル化または逆シリアル化に JsonSerializerOptions のローカル インスタンスを使用すると、コードが複数回実行されたときに、アプリケーションのパフォーマンスが大幅に低下する可能性があります。これは、System.Text.Json によって、シリアル化関連のメタデータが指定されたインスタンスに内部的にキャッシュされるためです。 |
CA1870: キャッシュされた 'SearchValues' インスタンスを使用してください | キャッシュされた SearchValues<T> インスタンスを使用すると、値を 'IndexOfAny' または 'ContainsAny' に直接渡すよりも効率的です。 |
CA1871: 'ArgumentNullException.ThrowIfNull' に null 許容構造体を渡さないでください | 'ArgumentNullException.ThrowIfNull' は 'object' を受け入れるため、null 許容構造体を渡すと、値がボックス化される可能性があります。 |
CA1872: 'BitConverter.ToString' に基づく呼び出しチェーンよりも、'Convert.ToHexString' と 'Convert.ToHexStringLower' を優先する | バイトを 16 進文字列表現にエンコードする場合は、 Convert.ToHexString または Convert.ToHexStringLower を使用します。 これらのメソッドは、ダッシュとBitConverter.ToStringを置き換えるString.Replaceと組み合わせてString.ToLowerを使用するよりも効率的で割り当てに優れています。 |
CA2000:スコープを失う前にオブジェクトを破棄 | 例外的なイベントが発生するとオブジェクトのファイナライザーを実行できないため、オブジェクトに対するすべての参照がスコープ外になる前に、オブジェクトを明示的に破棄する必要があります。 |
CA2002:弱い ID を伴うオブジェクト上でロックしません | アプリケーション ドメインの境界を越えてオブジェクトに直接アクセスできる場合、そのオブジェクトの ID は不十分と表現されます。 スレッドで ID が不十分なオブジェクトをロックしようとすると、ブロックされることがあります。たとえば、異なるアプリケーション ドメインの別スレッドで、既に同じオブジェクトがロックされている場合です。 |
CA2007:タスクを直接待機しないでください | 非同期メソッドでは を直接Taskします。 非同期メソッドで Task を直接待機すると、タスクを作成したのと同じスレッドで継続が発生します。 この動作はパフォーマンスの面で大きな負担が生じ、その結果 UI スレッドでデッドロックが発生する可能性があります。 Task.ConfigureAwait(Boolean) を呼び出して継続の意図を示すことを検討してください。 |
CA2008:TaskScheduler を渡さずにタスクを作成しない | タスクの作成または継続の操作で、TaskScheduler パラメーターを指定しないメソッド オーバーロードを使用しています。 |
CA2009: ImmutableCollection 値で ToImmutableCollection を呼び出さないでください |
ToImmutable メソッドが System.Collections.Immutable 名前空間から変更できないコレクションで不必要に呼び出されました。 |
CA2011: セッター内でプロパティを割り当てません | プロパティの set アクセサー内でプロパティに値が誤って割り当てられました。 |
CA2012: ValueTask を正しく使用する必要があります | メンバーの呼び出しから返される ValueTask は、直接待機される必要があります。 ValueTask を複数回使用しようとしたり、完了する前に結果に直接アクセスしようとすると、例外や破損が発生する可能性があります。 このような ValueTask を無視すると、機能バグが示され、パフォーマンスが低下する可能性があります。 |
CA2013: 値の型と共に ReferenceEquals を使用しないでください | System.Object.ReferenceEquals を使用して値を比較するときに、objA と objB が値の型である場合、この 2 つは ReferenceEquals メソッドに渡される前にボックス化されます。 つまり、objA と objB が同じ値の型のインスタンスを表している場合でも、ReferenceEquals メソッドからは false が返されます。 |
CA2014: ループ内で stackalloc を使用しません | stackalloc によって割り当てられたスタック領域は、現在のメソッド呼び出しの終了時にのみ解放されます。 これをループ内で使用すると、スタックが無限に増加し、最終的にスタック オーバーフロー状態が発生する可能性があります。 |
CA2015: MemoryManager から派生した型にはファイナライザーを定義しません<T> | MemoryManager<T>から派生した型にファイナライザーを追加すると、Span<T>がまだ使用されている間にメモリを解放できる場合があります。 |
CA2016:CancellationToken パラメーターを 1 つのメソッドに転送する |
CancellationToken パラメーターを 1 つを取るメソッドに転送して操作のキャンセル通知が適切に伝達されるようにするか、または CancellationToken.None を明示的に渡して意図的にトークンを伝達しないことを指定します。 |
CA2017: パラメーター カウントが一致しません | ログ メッセージ テンプレートで指定されたパラメーターの数が、名前付きプレースホルダーの数と一致しません。 |
CA2018: count に対する Buffer.BlockCopy の引数で、コピーするバイト数を指定する必要がある |
Buffer.BlockCopy を使用するとき、count 引数では、コピーするバイト数を指定します。
Array.Length は、その要素のサイズが正確に 1 バイトの配列上の count 要素にのみ使用します。
byte 、sbyte 、および bool には、サイズが 1 バイトの要素があります。 |
CA2019: ThreadStatic フィールドでインライン初期化を使用しないでください |
ThreadStaticAttribute で注釈が付けられたフィールドはインラインで初期化される、または明示的に static (Visual Basic では Shared ) コンストラクターで初期化されます。 |
CA2020: IntPtr/UIntPtr の組み込み演算子によって発生する動作変更を防止する | .NET 7 で追加されたいくつかの組み込み演算子の動作が、.NET 6 以前のバージョンのユーザー定義演算子とは異なります。 オーバーフロー中に unchecked コンテキストでスローしていた一部の演算子が、checked コンテキスト内でラップされない限り、スローしなくなります。 以前は checked コンテキストでスローしなかった一部の演算子が、unchecked コンテキスト内でラップされない限りスローするようになります。 |
CA2021: 互換性のない型を指定して Enumerable.Cast<T> または Enumerable.OfType<T> を呼び出さない | Enumerable.Cast<TResult>(IEnumerable) または Enumerable.OfType<TResult>(IEnumerable) の呼び出しで、入力コレクションの型と互換性のない型パラメーターが指定されています。 |
CA2022: Stream.Read で読み取りを不正確にしないでください |
Stream.Read を呼び出すと、要求されたバイト数よりも少ないバイト数が返される可能性があり、戻り値がチェックされていない場合、コードの信頼性が低下する可能性があります。 |
CA2100:SQL クエリのセキュリティ脆弱性を確認 | メソッドに渡された文字列引数から構築された文字列を使用して System.Data.IDbCommand.CommandText プロパティが設定されています。 この規則では、文字列引数にユーザー入力が含まれていることが想定されています。 ユーザー入力から構築された SQL コマンド文字列には、SQL 注入攻撃に対する脆弱性があります。 |
CA2101: P/Invoke 文字列引数に対してマーシャリングを指定します | プラットフォーム呼び出しメンバーが、部分信頼の呼び出し元を許可し、文字列パラメーターを持ち、さらにその文字列を明示的にマーシャリングしていません。 これはセキュリティ上の脆弱性となる可能性があります。 |
CA2109:表示するイベント ハンドラーを確認します | パブリックまたはプロテクトのイベント ハンドラー メソッドが検出されました。 イベント ハンドラー メソッドは、絶対に必要な場合を除き公開しないでください。 |
CA2119:プライベート インターフェイスを満たすメソッドをシールします | 継承可能なパブリック型により、internal (Visual Basic では Friend) インターフェイスのオーバーライド可能なメソッド実装が提供されます。 この規則違反を修正するには、アセンブリの外側でメソッドがオーバーライドされないようにします。 |
CA2153: 破損状態例外の処理を回避します | 破損状態例外 (CSE) は、メモリの破損がプロセス内に存在していることを示します。 プロセスをクラッシュさせるのではなくこれらの例外をキャッチすることは、攻撃者が破損したメモリ領域にセキュリティ上の弱点を見出すことができた場合に、セキュリティ上の脆弱性となる可能性があります。 |
CA2200:スタック詳細を保持するために再度スローします | 例外が再スローされ、その例外が throw ステートメントで明示的に指定されています。 throw ステートメントで例外を指定して例外が再スローされると、例外をスローした元のメソッドと現在のメソッドの間で呼び出されたメソッドの一覧は失われます。 |
CA2201:予約された例外の種類を発生させません | これにより、元のエラーの検出およびデバッグが困難になります。 |
CA2207:値型のスタティック フィールドのインラインを初期化します | 値型で明示的な静的コンストラクターを宣言しています。 この規則違反を修正するには、静的データが宣言されたとき、および静的コンストラクターを削除するときに、静的データをすべて初期化します。 |
CA2208:引数の例外を正しくインスタンス化します |
ArgumentException または派生した例外型の既定の (パラメーターなしの) コンストラクターに対して呼び出しが行われるか、ArgumentException から派生した例外型のパラメーター化されたコンストラクターに正しくない文字列引数が渡されます。 |
CA2211:非定数フィールドは表示されません | 定数でも読み取り専用でもない静的フィールドは、スレッド セーフではありません。 このようなフィールドへのアクセスは、慎重に制御してください。また、クラス オブジェクトへのアクセスを同期するには、高度なプログラミング技術が必要です。 |
CA2213:破棄可能なフィールドは破棄されなければなりません | System.IDisposable を実装する型が、IDisposable も実装する型を持つフィールドを宣言しています。 このフィールドの Dispose メソッドは、宣言している型の Dispose メソッドから呼び出されていません。 |
CA2214:コンストラクターのオーバーライド可能なメソッドを呼び出しません | コンストラクターが仮想メソッドを呼び出すと、メソッドを呼び出すインスタンスのコンストラクターが実行されていない可能性があります。 |
CA2215:Dispose メソッドが基底クラスの Dispose を呼び出す必要があります | 型が、破棄できる型から継承している場合、使用している Dispose メソッド内から基本型の Dispose メソッドを呼び出す必要があります。 |
CA2216:破棄可能な型はファイナライザーを宣言しなければなりません | System.IDisposable を実装し、アンマネージ リソースの使用を提案するフィールドが含まれる型が、Object.Finalize で記述されているようにファイナライザーを実装していません。 |
CA2217:列挙型を FlagsAttribute に設定しません | 外部から参照できる列挙型が FlagsAttribute でマークされ、その列挙型に、2 の累乗でもなく、その列挙型で定義されている他の値の組み合わせでもない値が 1 つ以上含まれています。 |
CA2218:オーバーライドする Equals で GetHashCode をオーバーライドします | パブリック型で System.Object.Equals をオーバーライドしていますが、System.Object.GetHashCode をオーバーライドしていません。 |
CA2219:exception 句に例外を発生させないでください | finally 句または fault 句で例外が発生すると、アクティブな例外が新しい例外によって隠されます。 filter 句で例外が発生すると、ランタイムがその例外を暗黙的にキャッチします。 これにより、元のエラーの検出およびデバッグが困難になります。 |
CA2224:オーバーロードする演算子 equals で Equals をオーバーライドします | パブリック型で等値演算子が実装されていますが、System.Object.Equals がオーバーライドされていません。 |
CA2225:演算子オーバーロードには名前付けされた代替が存在します | 演算子のオーバーロードが検出され、予想される名前の代替メソッドが検出されませんでした。 名前付きの代替メンバーによって、演算子と同じ機能へアクセスできるようになります。また、演算子のオーバーロードをサポートしていない言語でプログラミングする場合でも、その代替メンバーを使用できます。 |
CA2226:演算子は対称型オーバーロードを含まなければなりません | 型で等値演算子または非等値演算子を実装し、逆の働きをする演算子を実装していません。 |
CA2227:Collection プロパティは読み取り専用でなければなりません | 書き込み可能なコレクション プロパティにより、ユーザーはコレクションを異なるコレクションで置換できます。 読み取り専用プロパティは、コレクションを置換できないようにしますが、個別のメンバーが設定されることは回避できません。 |
CA2229:シリアル化コンストラクターを実装します | この規則違反を修正するには、シリアル化コンストラクターを実装します。 シールされたクラスの場合、コンストラクターをプライベートにするか、プロテクトにします。 |
CA2231:ValueType.Equals のオーバーライドで、演算子 equals をオーバーロードします | 値型は、Object.Equals をオーバーライドしていますが、等値演算子を実装していません。 |
CA2234:文字列の代わりに System.Uri オブジェクトを渡します | "uri"、"URI"、"urn"、"URN"、"url"、または "URL" という名前を持つ文字列パラメーターが指定されているメソッドに対して、呼び出しが行われました。 そのメソッドの型宣言に対応するメソッドのオーバーロードが存在し、それに対して System.Uri パラメーターが指定されています。 |
CA2235:すべてのシリアル化不可能なフィールドを設定します | シリアル化できない型のインスタンス フィールドが、シリアル化できる型で宣言されています。 |
CA2237:ISerializable 型を SerializableAttribute に設定します | 型が共通言語ランタイムでシリアル化できると認識されるようにするには、型を SerializableAttribute 属性でマークする必要があります。型が ISerializable インターフェイスの実装を通じてカスタムのシリアル化ルーチンを使用している場合でも、マークする必要があります。 |
CA2241:書式設定メソッドに正しい引数を提供 | System.String.Format に渡される引数 format に、各オブジェクトの引数に対応する書式指定項目が含まれていません (その逆も考えられます)。 |
CA2242:NaN に対して正しくテストします | この式が Single.Nan または Double.Nan に対して値をテストしています。 値をテストするには、Single.IsNan(Single) または Double.IsNan(Double) を使用します。 |
CA2243:属性文字列リテラルは、正しく解析する必要があります | 属性のリテラル文字列パラメーターが URL、GUID、またはバージョンとして正しく解析されません。 |
CA2244: インデックス付き要素の初期化を重複させません | オブジェクト初期化子に、定数インデックスが同じインデックス付き要素の初期化子が複数あります。 最後の初期化子を除くすべての初期化子は冗長です。 |
CA2245: プロパティをそれ自体に割り当てません | プロパティが誤ってそれ自体に割り当てられました。 |
CA2246: 同じステートメントにシンボルとそのメンバーを割り当てません | 同じステートメントでシンボルとそのメンバー、つまりフィールドまたはプロパティを代入することは推奨されていません。 メンバー アクセスが代入前のシンボルの古い値を使用するのか、このステートメントの代入からの新しい値を使用するのかが明確ではありません。 |
CA2247: TaskCompletionSource コンストラクターに渡された引数は、TaskContinuationOptions 列挙型ではなく、TaskCreationOptions 列挙型にする必要があります | TaskCompletionSource には、基になるタスクを制御する TaskCreationOptions を使用するコンストラクターと、そのタスクに格納されているオブジェクトの状態を使用するコンストラクターがあります。 TaskCreationOptions の代わりに TaskContinuationOptions を誤って渡すと、呼び出しでオプションが状態として処理されます。 |
CA2248: 正しい enum 引数を Enum.HasFlag に指定します |
HasFlag メソッドに引数として渡された列挙型が呼び出し元の列挙型と異なります。 |
CA2249:String.IndexOf の代わりに String.Contains を使用することを検討します | 部分文字列が存在するかどうかを確認するために結果を使用する string.IndexOf の呼び出しは、string.Contains で置き換えることができます。 |
CA2250: ThrowIfCancellationRequested を使用します |
ThrowIfCancellationRequested は、トークンが取り消されているかどうかを自動的にチェックし、されている場合は OperationCanceledException をスローします。 |
CA2251: String.Equals の代わりに String.Compare を使用します |
String.Equals の結果を 0 と比較する代わりに、String.Compare を使用したほうがより明確であり、速い可能性があります。 |
CA2252: プレビュー機能をオプトインする | プレビュー API を使用する前に、プレビュー機能をオプトインします。 |
CA2253: 名前付きプレースホルダーを数値にすることはできません | ログ メッセージ テンプレートの名前付きプレースホルダーは、数字のみで構成することはできません。 |
CA2254: テンプレートは静的な式にする必要があります | ログ メッセージ テンプレートは、呼び出しによって異なるべきではありません。 |
CA2255: ModuleInitializer 属性をライブラリ内で使用しないでください |
モジュール初期化子は、アプリケーション コードの実行が開始される前にアプリケーションのコンポーネントが初期化されるようにするために、アプリケーション コードで使用することを想定しています。 |
CA2256: 親インターフェイスで宣言されたすべてのメンバーは、DynamicInterfaceCastableImplementation 属性インターフェイスに実装されている必要があります |
DynamicInterfaceCastableImplementationAttribute の属性がある型は、IDynamicInterfaceCastable 型を実装する型のインターフェイス実装として機能します。 結果として、継承されたインターフェイスに定義されているすべてのメンバーの実装を提供する必要があります。IDynamicInterfaceCastable を実装する型からは、他の方法ではそれが提供されないためです。 |
CA2257: 'DynamicInterfaceCastableImplementationAttribute' を持つインターフェイスで定義されたメンバーは 'static' である必要があります |
IDynamicInterfaceCastable を実装する型はメタデータに動的インターフェイスを実装しない可能性があるため、この型で定義されている明示的な実装ではないインスタンス インターフェイス メンバーの呼び出しは、実行時に失敗する可能性があります。 実行時エラーを回避するには、新しいインターフェイス メンバー static をマークします。 |
CA2258: Visual Basic での 'DynamicInterfaceCastableImplementation' インターフェイスの指定はサポートされていません | 機能的 DynamicInterfaceCastableImplementationAttribute 属性付きインターフェイスを提供するには、Visual Basic でサポートされていない Default Interface Members 機能が必要になります。 |
CA2259: ThreadStatic が静的フィールドでのみ使用されていることを確認してください |
ThreadStaticAttribute は、 static (Visual Basic の場合は Shared ) フィールドにのみ影響します。 インスタンス フィールドに適用した場合、 属性は動作に影響しません。 |
CA2260: 汎用数学インターフェイスを正しく実装する | 汎用的な数式インターフェイスでは、派生型自体を自己反復する種類のパラメーターに使用する必要があります。 |
CA2261: ConfigureAwaitOptions.SuppressThrowing を Task<TResult> と共に使用しない |
この ConfigureAwaitOptions.SuppressThrowing オプションは、無効な Task<TResult> を返す可能性があるため、ジェネリック TResult ではサポートされていません。 |
CA2262: MaxResponseHeadersLength を正しく設定する |
MaxResponseHeadersLength の値が正しく指定されていることを確認します。 この値はキロバイト単位です。 |
CA2263: 型がわかっている場合はジェネリック オーバーロードを優先する | ジェネリック オーバーロードを使用すると、型がわかっている場合に System.Type 引数を渡す方が適しています。これは、コンパイル時のチェックが改善された、よりクリーンでタイプ セーフなコードが促進されるためです。 |
CA2264: 'ArgumentNullException.ThrowIfNull' に null 非許容値を渡さないでください | 渡された引数が 'null' の場合、'ArgumentNullException.ThrowIfNull' がスローされます。 null 非許容構造体や 'nameof()' 式や 'new' 式などの特定のコンストラクトは null になることはないため、'ArgumentNullException.ThrowIfNull' はスローされません。 |
CA2265: Span<T> と null または default |
スパンと null または default を比較しても、意図したとおりに動作しない場合があります。
default
null リテラルは暗黙的にSpan<T>.Empty に変換されます。 |
CA2300:安全ではないデシリアライザー BinaryFormatter を使用しないでください | 安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 |
CA2301:最初に BinaryFormatter.Binder を設定しないで BinaryFormatter.Deserialize を呼び出さないでください | 安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 |
CA2302:BinaryFormatter.Deserialize を呼び出す前に BinaryFormatter.Binder が設定されていることを確認します | 安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 |
CA2305:安全ではないデシリアライザー LosFormatter を使用しないでください | 安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 |
CA2310:安全ではないデシリアライザー NetDataContractSerializer を使用しないでください | 安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 |
CA2311:最初に NetDataContractSerializer.Binder を設定しないで逆シリアル化しないでください | 安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 |
CA2312:NetDataContractSerializer.Binder を設定してから逆シリアル化してください | 安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 |
CA2315:安全ではないデシリアライザー ObjectStateFormatter を使用しないでください | 安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 |
CA2321:SimpleTypeResolver を使って JavaScriptSerializer で逆シリアル化しないでください | 安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 |
CA2322:逆シリアル化する前に JavaScriptSerializer が SimpleTypeResolver によって初期化されていないことを確認してください | 安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 |
CA2326: None 以外の TypeNameHandling 値は使用しないでください | 安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 |
CA2327: 安全でない JsonSerializerSettings を使用しないでください | 安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 |
CA2328: JsonSerializerSettings が安全であることを確認してください | 安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 |
CA2329: セキュリティで保護されていない構成が JsonSerializer で使用されている場合は、逆シリアル化を行わないでください | 安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 |
CA2330: 逆シリアル化の際に、JsonSerializer の構成は確実にセキュリティで保護してください | 安全でない逆シリアライザーは、信頼されていないデータを逆シリアル化するときに脆弱です。 攻撃者がシリアル化されたデータを変更して予期されない型を追加し、悪意のある副作用を持つオブジェクトを挿入する可能性があります。 |
CA2350:DataTable.ReadXml() の入力が信頼されていることを確認してください | 信頼されていない入力を使用して DataTable を逆シリアル化すると、攻撃者が悪意のある入力を作成してサービス拒否攻撃を仕掛ける可能性があります。 不明なリモート コード実行の脆弱性が存在する可能性があります。 |
CA2351:DataSet.ReadXml() の入力が信頼されていることを確認してください | 信頼されていない入力を使用して DataSet を逆シリアル化すると、攻撃者が悪意のある入力を作成してサービス拒否攻撃を仕掛ける可能性があります。 不明なリモート コード実行の脆弱性が存在する可能性があります。 |
CA2352: シリアル化可能な型の安全でない DataSet または DataTable は、リモート コード実行攻撃に対して脆弱になる可能性があります | SerializableAttribute でマークされたクラスまたは構造体に DataSet または DataTable フィールドまたはプロパティは含まれていますが、GeneratedCodeAttribute はありません。 |
CA2353: シリアル化可能な型の安全でない DataSet または DataTable | XML シリアル化属性またはデータ コントラクト属性でマークされたクラスまたは構造体に、DataSet または DataTable フィールドまたはプロパティが含まれています。 |
CA2354:逆シリアル化されたオブジェクト グラフの安全でない DataSet または DataTable は、リモート コード実行攻撃に対して脆弱になる可能性があります | System.Runtime.Serialization.IFormatter シリアル化で逆シリアル化し、キャストされた型のオブジェクト グラフに DataSet または DataTable を含んでいる可能性があります。 |
CA2355:逆シリアル化されたオブジェクト グラフの安全でない DataSet または DataTable | キャストされたまたは指定された型のオブジェクト グラフに DataSet または DataTable を含んでいる可能性があるときに逆シリアル化しています。 |
CA2356: Web の逆シリアル化されたオブジェクト グラフの安全でない DataSet または DataTable | System.Web.Services.WebMethodAttributeまたはSystem.ServiceModel.OperationContractAttributeを持つメソッドには、DataSetまたはDataTableを参照するパラメーターがあります。 |
CA2361: DataSet.ReadXml() を含む自動生成クラスが信頼されていないデータで使用されていないことを確認してください | 信頼されていない入力を使用して DataSet を逆シリアル化すると、攻撃者が悪意のある入力を作成してサービス拒否攻撃を仕掛ける可能性があります。 不明なリモート コード実行の脆弱性が存在する可能性があります。 |
CA2362: シリアル化可能な自動生成型の安全でない DataSet または DataTable は、リモート コード実行攻撃に対して脆弱になる可能性があります | BinaryFormatter で信頼されていない入力を逆シリアル化し、逆シリアル化されたオブジェクト グラフに DataSet または DataTable が含まれている場合、攻撃者が悪意のあるペイロードを作成して、リモート コード実行攻撃を仕掛ける可能性があります。 |
CA3001:SQL インジェクションの脆弱性のコード レビュー | 信頼されていない入力と SQL コマンドを処理するときには、SQL インジェクション攻撃に注意してください。 SQL インジェクション攻撃では、悪意のある SQL コマンドが実行され、アプリケーションのセキュリティと整合性が損なわれる可能性があります。 |
CA3002:XSS の脆弱性のコード レビュー | Web 要求からの信頼されていない入力を処理するときには、クロスサイト スクリプティング (XSS) 攻撃に注意してください。 XSS 攻撃によって信頼されていない入力が未加工の HTML 出力に挿入され、攻撃者が悪意のあるスクリプトを実行するか、Web ページのコンテンツを故意に変更できるようになります。 |
CA3003:ファイル パス インジェクションの脆弱性のコード レビュー | Web 要求からの信頼されていない入力を処理するときには、ユーザー制御の入力の使用に注意してください。 |
CA3004:情報漏えいの脆弱性のコード レビュー | 例外情報を公開すると、攻撃者はアプリケーションの内部に関する分析情報を入手して、悪用できる他の脆弱性を見つけることができます。 |
CA3005: LDAP インジェクションの脆弱性のコードを確認する | 信頼されていない入力を処理する場合は、ライトウェイト ディレクトリ アクセス プロトコル (LDAP) インジェクション攻撃に注意してください。 攻撃者は、情報ディレクトリに対して悪意のある LDAP ステートメントを実行するおそれがあります。 ディレクトリ サービスにアクセスするための動的 LDAP ステートメントを、ユーザーによる入力を使用して作成するアプリケーションは、特に脆弱です。 |
CA3006:プロセス コマンド インジェクションの脆弱性のコード レビュー | 信頼されていない入力を処理するときには、コマンド インジェクション攻撃に注意してください。 コマンド インジェクション攻撃では、基になるオペレーティング システムに対して悪意のあるコマンドが実行され、サーバーのセキュリティと整合性が損なわれる可能性があります。 |
CA3007:オープン リダイレクトの脆弱性のコード レビュー | 信頼されていない入力を処理するときには、オープン リダイレクトの脆弱性に注意してください。 攻撃者はオープン リダイレクトの脆弱性を悪用し、Web サイトを利用して正規の URL を表し、疑っていない訪問者をフィッシングなどの悪意のある Web ページにリダイレクトできます。 |
CA3008:XPath インジェクションの脆弱性のコード レビュー | 信頼されていない入力を処理するときには、XPath インジェクション攻撃に注意してください。 信頼されていない入力を使用して XPath クエリを構築すると、攻撃者が悪意を持ってクエリを操作して意図しない結果を返し、クエリされた XML の内容を開示する可能性があります。 |
CA3009:XML インジェクションの脆弱性のコード レビュー | 信頼されていない入力を処理するときには、XML インジェクション攻撃に注意してください。 |
CA3010:XAML インジェクションの脆弱性のコード レビュー | 信頼されていない入力を処理するときには、XAML インジェクション攻撃に注意してください。 XAML は、オブジェクトのインスタンス化と実行を直接表すマークアップ言語です。 つまり、XAML に作成された要素とシステム リソース (ネットワーク アクセス、ファイル システム IO など) の間でやり取りできます。 |
CA3011:DLL インジェクションの脆弱性のコード レビュー | 信頼できない入力を処理するときには、信頼されていないコードの読み込みに注意してください。 Web アプリケーションが信頼されていないコードを読み込む場合、攻撃者は悪意のある DLL をプロセスに挿入し、悪意のあるコードを実行できる可能性があります。 |
CA3012:RegEx インジェクションの脆弱性のコード レビュー | 信頼されていない入力を処理するときには、正規表現インジェクション攻撃に注意してください。 攻撃者は、正規表現インジェクションを使用して正規表現を故意に変更したり、正規表現を意図しない結果と一致させたりする可能性があります。また、正規表現によって CPU を過度に消費し、サービス拒否攻撃を行う可能性もあります。 |
CA3061:URL でスキーマを追加しません | 危険な外部参照を引き起こす可能性があるため、Add メソッドの安全でないオーバーロードを使用しないでください。 |
CA3075:安全ではない DTD の処理 | 安全でない DTDProcessing インスタンスを使用する場合、または外部エンティティ ソースを参照している場合、パーサーは信頼されていない入力を受け入れ、機密情報を攻撃者に開示する可能性があります。 |
CA3076:安全ではない XSLT スクリプトの実行 | .NET アプリケーションで拡張スタイルシート言語変換 (XSLT) を安全に実行しないと、信頼されていない URI 参照がプロセッサによって解決され、攻撃者に機密情報が開示され、サービス拒否攻撃やクロスサイト攻撃が発生する可能性があります。 |
CA3077:API のデザイン、XML ドキュメント、および XML テキスト リーダーでの安全ではない処理 | XMLDocument と XMLTextReader から派生する API をデザインする場合、DtdProcessing にご注意ください。 外部エンティティ ソースを参照または解決するとき、または XML で安全でない値を設定するときに安全でない DTDProcessing インスタンスを使用すると、情報漏えいにつながる可能性があります。 |
CA3147:ValidateAntiForgeryToken で動詞ハンドラーをマークします | ASP.NET MVC コントローラーを設計するときには、クロスサイト リクエスト フォージェリ攻撃に注意してください。 クロスサイト リクエスト フォージェリ攻撃では、認証されたユーザーから ASP.NET MVC コントローラーに悪意のある要求が送信される可能性があります。 |
CA5350:脆弱な暗号アルゴリズムを使用しないでください | 現在、さまざまな理由で弱い暗号化アルゴリズムとハッシュ関数が使用されていますが、保護対象のデータの機密性や整合性を保証するためにこれらを使用しないでください。 このルールは、コードで TripleDES、SHA1、または RIPEMD160 アルゴリズムが検出されるとトリガーされます。 |
CA5351: 破られた暗号アルゴリズムを使用しないでください | 破られた暗号アルゴリズムはセキュアであるとは見なされず、それらを使用しないことを強くお勧めします。 このルールは、コードに MD5 ハッシュ アルゴリズムや、DES か RC2 のいずれかの暗号化アルゴリズムが検出されるとトリガーされます。 |
CA5358:安全ではない暗号モードを使用しないでください | 安全ではない暗号モードを使用しないでください |
CA5359: 証明書の検証を無効にしないでください | 証明書を使用すると、サーバーの ID を認証できます。 クライアントでは、サーバー証明書を検証し、要求が意図したとおりのサーバーに送信されるようにする必要があります。 ServerCertificateValidationCallback によって常に true が返されると、すべての証明書が検証に成功します。 |
CA5360: 逆シリアル化で危険なメソッドを呼び出さないでください | 安全でない逆シリアル化は、信頼されていないデータを使用してアプリケーションのロジックが悪用されたり、サービス拒否 (DoS) 攻撃が仕掛けられたり、逆シリアル化されたときに任意のコードが実行されたりするときに発生する脆弱性です。 悪意のあるユーザーが自分の管理下にある信頼されていないデータをアプリケーションで逆シリアル化しているときに、これらの逆シリアル化機能を悪用することがよくあります。 具体的には、逆シリアル化の過程で危険なメソッドを呼び出します。 安全でない逆シリアル化攻撃が成功すると、攻撃者は DoS 攻撃、認証回避、リモートでのコード実行などの攻撃を仕掛ける可能性があります。 |
CA5361: 強力な暗号の Schannel の使用を無効にしません |
Switch.System.Net.DontEnableSchUseStrongCrypto を true に設定すると、送信トランスポート層セキュリティ (TLS) 接続で使用される暗号が弱くなります。 暗号が弱くなると、アプリケーションとサーバー間の通信の機密性が損なわれ、攻撃者が機密データを簡単に傍受できるようになります。 |
CA5362: 逆シリアル化されたオブジェクト グラフで可能性のある参照サイクル | 信頼されていないデータを逆シリアル化すると、逆シリアル化されたオブジェクト グラフを処理するすべてのコードで、無限ループに入ることなく参照サイクルを処理する必要があります。 これには、逆シリアル化コールバックの一部であるコードと、逆シリアル化が完了した後にオブジェクト グラフを処理するコードの両方が含まれます。 そうしないと、攻撃者が参照サイクルを含む悪意のあるデータを使用してサービス拒否攻撃を仕掛ける可能性があります。 |
CA5363:要求の検証を無効にしません | 要求の検証は、ASP.NET の機能の 1 つで、HTTP 要求を調べ、その要求にクロスサイトスクリプティングを含むインジェクション攻撃につながる可能性のある危険なコンテンツが含まれていないかどうかを確認します。 |
CA5364: 非推奨のセキュリティ プロトコルを使用しないでください | トランスポート層セキュリティ (TLS) では、コンピューター間の通信を保護し、ハイパーテキスト転送プロトコル セキュア (HTTPS) とよく併用されます。 TLS の古いプロトコル バージョンは TLS 1.2 や TLS 1.3 よりも安全性が低く、新しい脆弱性が見つかる可能性が高くなります。 リスクを最小限に抑えるために、古いプロトコル バージョンを使用しないようにしてください。 |
CA5365: HTTP ヘッダーのチェックを無効にしません | HTTP ヘッダーのチェックでは、応答ヘッダーに含まれる復帰 \r や改行文字 \n のエンコードを有効にします。 このエンコードは、ヘッダーに含まれる信頼されていないデータをエコーするアプリケーションを悪用するインジェクション攻撃を回避するのに役立ちます。 |
CA5366: DataSet Read XML に XmlReader を使用します | 信頼されていないデータを含む XML を読み取るために DataSet を使用すると、危険な外部参照が読み込まれる可能性があります。これは、セキュリティで保護されたリゾルバーまたは DTD 処理を無効にした XmlReader を使用して制限する必要があります。 |
CA5367: ポインター フィールドを持つ型をシリアル化しません | この規則では、ポインター フィールドまたはプロパティを持つシリアル化可能なクラスがあるかどうかをチェックします。 静的メンバー、NonSerializedAttribute でマークされたフィールドなど、シリアル化できないメンバーがポインターになる可能性があります。 |
CA5368: ページから派生したクラスに ViewStateUserKey を設定します | ViewStateUserKey プロパティを設定すると、識別子を個別のユーザーの view-state 変数に割り当てて、攻撃者が変数を使用した攻撃を実行できないようにすることで、アプリケーションに対する攻撃を防ぐことができます。 そうしない場合、クロスサイト リクエスト フォージェリに対する脆弱性が生じます。 |
CA5369:逆シリアル化に XmlReader を使用します | 信頼されていない DTD スキーマと XML スキーマを処理すると、危険な外部参照を読み込むことができます。これは、セキュリティで保護されたリゾルバーを使用するか、DTD および XML インライン スキーマ処理を無効にして XmlReader を使用して制限する必要があります。 |
CA5370:読み取りの検証に XmlReader を使用します | 信頼されていない DTD スキーマと XML スキーマを処理すると、危険な外部参照を読み込める可能性があります。 この危険な読み込みは、XmlReader を安全なリゾルバーと共に使用するか、DTD と XML インライン スキーマ処理を無効にして使用することにより制限する必要があります。 |
CA5371:スキーマの読み取りに XmlReader を使用します | 信頼されていない DTD スキーマと XML スキーマを処理すると、危険な外部参照を読み込める可能性があります。 XmlReader を安全なリゾルバーと共に使用するか、DTD と XML インライン スキーマ処理を無効にして使用することにより、この処理を制限します。 |
CA5372:XPathDocument に XmlReader を使用します | 信頼されていないデータから XML を処理すると、危険な外部参照が読み込まれる可能性があります。これは、セキュリティで保護されたリゾルバーまたは DTD 処理が無効になっている XmlReader を使用して制限できます。 |
CA5373:廃止されたキー派生関数を使用しません | この規則では、弱いキー派生メソッド System.Security.Cryptography.PasswordDeriveBytes と Rfc2898DeriveBytes.CryptDeriveKey の呼び出しを検出します。
System.Security.Cryptography.PasswordDeriveBytes で弱いアルゴリズム PBKDF1 が使用されました。 |
CA5374: XslTransform を使用しません | この規則では、System.Xml.Xsl.XslTransform がコードでインスタンス化されるかどうかをチェックします。 System.Xml.Xsl.XslTransform は古いため、使用しないでください。 |
CA5375: アカウントの Shared Access Signature を使用しないでください | アカウントの SAS では、サービス SAS で許可されていない BLOB コンテナー、テーブル、キューおよびファイル共有の読み取り、書き込みおよび削除操作へのアクセスを委任できます。 ただし、コンテナーレベルのポリシーをサポートしておらず、付与されるアクセス許可に対する柔軟性と制御力は高くありません。 悪意のあるユーザーがアカウントの SAS を入手すると、ストレージ アカウントは簡単に侵害されます。 |
CA5376: SharedAccessProtocol HttpsOnly を使用します | SAS は HTTP を介してプレーン テキストで転送できない機密データです。 |
CA5377: コンテナー レベルのアクセス ポリシーを使用します | コンテナーレベルのアクセス ポリシーは、いつでも変更または取り消すことができます。 このため、付与されるアクセス許可をより柔軟に制御できます。 |
CA5378: ServicePointManagerSecurityProtocols を無効にしません |
Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols を true に設定すると、Windows Communication Framework (WCF) のトランスポート層セキュリティ (TLS) 接続が TLS 1.0 に制限されます。 このバージョンの TLS は非推奨になる予定です。 |
CA5379: 弱いキー派生関数アルゴリズムを使用しない |
Rfc2898DeriveBytes クラスでは、既定で SHA1 アルゴリズムを使用します。
SHA256 またはそれ以上を使用して、コンストラクターの一部のオーバーロードで使用するハッシュ アルゴリズムを指定する必要があります。 ただし、HashAlgorithm プロパティには get アクセサーしかなく、overridden 修飾子はありません。 |
CA5380:ルート ストアに証明書を追加しません | この規則では、証明書を信頼されたルート証明機関の証明書ストアに追加するコードを検出します。 既定では、信頼されたルート証明機関の証明書ストアは、Microsoft ルート証明書プログラムの要件を満たした一連の公的 CA で構成されています。 |
CA5381:証明書がルート ストアに追加されていないことを確認します | この規則では、証明書を信頼されたルート証明機関の証明書ストアに追加する可能性があるコードを検出します。 既定では、信頼されたルート証明機関の証明書ストアは、Microsoft ルート証明書プログラムの要件を満たした一連の公的証明機関 (CA) で構成されています。 |
CA5382: ASP.NET Core で安全な Cookie を使用します | HTTPS 経由で使用できるアプリケーションでは、セキュリティで保護された Cookie を使用する必要があります。つまり、Cookie は Secure Sockets Layer (SSL) のみを使用して転送する必要があることをブラウザーに示す必要があります。 |
CA5383: ASP.NET Core で安全な Cookie を確実に使用します | HTTPS 経由で使用できるアプリケーションでは、セキュリティで保護された Cookie を使用する必要があります。つまり、Cookie は Secure Sockets Layer (SSL) のみを使用して転送する必要があることをブラウザーに示す必要があります。 |
CA5384: デジタル署名アルゴリズム (DSA) を使用しません | DSA は、弱い非対称暗号化アルゴリズムです。 |
CA5385: 十分なキー サイズの Rivest–Shamir–Adleman (RSA) アルゴリズムを使用します | 2048 ビットよりも小さい RSA キーは、ブルート フォース攻撃に対する脆弱性が高くなります。 |
CA5386: SecurityProtocolType 値のハードコードを避けます | トランスポート層セキュリティ (TLS) では、コンピューター間の通信を保護し、ハイパーテキスト転送プロトコル セキュア (HTTPS) とよく併用されます。 プロトコル バージョン TLS 1.0 と TLS 1.1 は非推奨で、TLS 1.2 と TLS 1.3 が現行のバージョンです。 今後、TLS 1.2 と TLS 1.3 は非推奨になる可能性があります。 アプリケーションをセキュリティで保護し続けるために、プロトコル バージョンをハードコーティングしないようにし、少なくとも .NET Framework v4.7.1 を対象にしてください。 |
CA5387: 反復回数が十分でない弱いキー派生関数は使用しません | この規則では、反復回数が 100,000 回未満の Rfc2898DeriveBytes によって暗号化キーが生成されたかどうかをチェックします。 反復回数が多いほど、生成された暗号化キーを推測しようとする辞書攻撃を緩和するのに役立ちます。 |
CA5388: 弱いキー派生関数を使用する場合は十分な反復回数を確保してください | この規則では、反復回数が 100,000 未満の Rfc2898DeriveBytes によって暗号化キーが生成されたかどうかを確認します。 反復回数が多いほど、生成された暗号化キーを推測しようとする辞書攻撃を緩和するのに役立ちます。 |
CA5389:アーカイブ項目のパスをターゲット ファイル システム パスに追加しません | ファイル パスは相対パスの場合があり、想定されるファイル システムのターゲット パス以外でファイル システムへのアクセスが可能になる可能性があります。これは、lay-and-wait の技法によって悪意のある構成変更とリモート コードの実行につながります。 |
CA5390: 暗号化キーをハードコーディングしません | 対称アルゴリズムを成功させるには、送信側と受信側だけに秘密キーを伝える必要があります。 キーがハードコーディングされていると、簡単に検出できます。 コンパイルされたバイナリでも、悪意のあるユーザーが簡単に抽出できます。 秘密キーが侵害されると、暗号テキストを直接復号化できるようになるため、保護されていない状態になります。 |
CA5391: ASP.NET Core MVC コントローラーで偽造防止トークンを使用します | 偽造防止トークンを検証せずに、 POST 、 PUT 、 PATCH 、または DELETE 要求を処理すると、クロスサイト リクエスト フォージェリ攻撃に対して脆弱になる可能性があります。 クロスサイト リクエスト フォージェリ攻撃では、認証されたユーザーから ASP.NET Core MVC コントローラーに悪意のある要求が送信される可能性があります。 |
CA5392: P/Invoke に対して DefaultDllImportSearchPaths 属性を使用します | 既定では、DllImportAttribute を使用している P/Invoke 関数では、ライブラリが読み込むための現在の作業ディレクトリを含むいくつかのディレクトリを精査します。 これは特定のアプリケーションでセキュリティ上の問題を引き起こし、DLL のハイジャックにつながる可能性があります。 |
CA5393: 安全でない DllImportSearchPath 値を使用しないでください | 既定の DLL 検索ディレクトリとアセンブリ ディレクトリに悪意のある DLL が存在する可能性があります。 または、アプリケーションが実行されている場所に応じて、アプリケーションのディレクトリに悪意のある DLL が存在する可能性があります。 |
CA5394: 安全でないランダム度を使用しません | 暗号に弱い擬似乱数ジェネレーターを使用すると、攻撃者は生成されるセキュリティに依存する値を予測できる可能性があります。 |
CA5395: アクション メソッドの HttpVerb 属性がありません | データの作成、編集、削除、またはそれ以外の変更を行うすべてのアクション メソッドは、偽造防止属性を使用してクロスサイト リクエスト フォージェリ攻撃から保護する必要があります。 GET 操作の実行は、副作用がなく、永続化されたデータを変更しない、安全な操作である必要があります。 |
CA5396: HttpCookie で HttpOnly を true に設定します | 高度な防御手段として、セキュリティ上注意が必要な HTTP Cookie が、必ず HttpOnly としてマークされるようにしてください。 これは、スクリプトから Cookie へのアクセスを Web ブラウザーで許可してはならないことを示しています。 挿入された悪意のあるスクリプトは、Cookie を盗むための一般的な方法です。 |
CA5397:非推奨の SslProtocols 値を使用しません | トランスポート層セキュリティ (TLS) では、コンピューター間の通信を保護し、ハイパーテキスト転送プロトコル セキュア (HTTPS) とよく併用されます。 TLS の古いプロトコル バージョンは TLS 1.2 や TLS 1.3 よりも安全性が低く、新しい脆弱性が見つかる可能性が高くなります。 リスクを最小限に抑えるために、古いプロトコル バージョンを使用しないようにしてください。 |
CA5398:ハードコーディングされた SslProtocols 値を回避します | トランスポート層セキュリティ (TLS) では、コンピューター間の通信を保護し、ハイパーテキスト転送プロトコル セキュア (HTTPS) とよく併用されます。 プロトコル バージョン TLS 1.0 と TLS 1.1 は非推奨で、TLS 1.2 と TLS 1.3 が現行のバージョンです。 今後、TLS 1.2 と TLS 1.3 は非推奨になる可能性があります。 アプリケーションをセキュリティで保護し続けるために、プロトコル バージョンをハードコーティングしないようにしてください。 |
CA5399: HttpClient 証明書失効リストの確認を確実に無効にします | 失効した証明書は信頼されていません。 攻撃者が HTTPS 通信で悪意のあるデータを渡すか、機密データを盗むために使用する可能性があります。 |
CA5400: HttpClient 証明書失効リストの確認を決して無効にしないでください | 失効した証明書は信頼されていません。 攻撃者が HTTPS 通信で悪意のあるデータを渡すか、機密データを盗むために使用する可能性があります。 |
CA5401: 既定以外の IV で CreateEncryptor を使用しません | 対称暗号化では、辞書攻撃を防ぐために、反復不能な初期化ベクトルを常に使用する必要があります。 |
CA5402: 既定の IV で CreateEncryptor を使用します | 対称暗号化では、辞書攻撃を防ぐために、反復不能な初期化ベクトルを常に使用する必要があります。 |
CA5403:証明書をハードコーディングしない |
data または rawData コンストラクターの X509Certificate または X509Certificate2 パラメーターがハードコーディングされています。 |
CA5404: トークンの検証チェックを無効にしないでください | トークンの検証を制御する TokenValidationParameters プロパティを false に設定してはいけません。 |
CA5405: デリゲートでトークンの検証を常にスキップしないでください |
AudienceValidator または LifetimeValidator に割り当てられているコールバックからは、常に true が返されます。 |
IL3000: 1 つのファイルとして発行するときにアセンブリ ファイル パスにアクセスしないようにする | 単一ファイルとして発行するときにアセンブリ ファイル パスにアクセスしないでください。 |
IL3001: 単一ファイルとして発行するときにアセンブリ ファイル パスにアクセスしないようにする | 単一ファイルとして発行するときにアセンブリ ファイル パスにアクセスしないでください。 |
IL3002: 1 つのファイルとして発行するときに、'RequiresAssemblyFilesAttribute' で注釈が付けられたメンバーを呼び出さないようにする | 1 つのファイルとして発行するときに 'RequiresAssemblyFilesAttribute' で注釈が付けられるメンバーを呼び出しません |
IL3003 'RequiresAssemblyFilesAttribute' 注釈は、すべてのインターフェイスの実装またはオーバーライドで一致しなければなりません。 | 'RequiresAssemblyFilesAttribute' 注釈は、すべてのインターフェイスの実装またはオーバーライドで一致しなければなりません。 |
IL3005: RequiresAssemblyFilesAttribute をアプリケーション エントリ ポイントに直接配置することはできません。 |
RequiresAssemblyFilesAttribute をアプリケーション エントリ ポイントに直接配置することはできません。 |
凡例
次の表は、参照ドキュメントの各ルールについて提供されている情報の種類を示しています。
項目 | 説明 |
---|---|
種類 | 規則の TypeName。 |
ルール ID | 規則の一意の識別子。 規則 ID とカテゴリは、ソース内で警告の省略表記として使用されます。 |
カテゴリ | 規則のカテゴリ (たとえば、セキュリティ)。 |
修正が中断ありか中断なしか | 規則違反を修正することが、互換性に影響する変更点かどうかを示します。 互換性に影響する変更点とは、違反の原因となった対象に対して依存関係を持つアセンブリが、新たに修正したバージョンで再コンパイルされないこと、または変更によって実行時にエラーになる可能性があることを示します。 複数の修正を適用でき、互換性に影響する変更点があるものとないものがある場合、"あり" と "なし" を併記しています。 |
原因 | 規則に従って警告が生成される原因になった特定のマネージド コード。 |
説明 | 警告の背景にある問題について説明します。 |
違反の修正方法 | 規則に適合し、警告が生成されないようにソース コードを変更する方法について説明します。 |
どのようなときに警告を抑制するか | 規則による警告を抑制しても安全な場合について説明します。 |
コード例 | 規則に違反する例と、規則に適合する修正した例を示します。 |
関連規則 | 関連する規則。 |
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET