CA2006: SafeHandle を使用して、ネイティブ リソースを要約します
Item | [値] |
---|---|
規則 ID | CA2006 |
カテゴリ | Microsoft.Reliability |
互換性に影響する変更点 | なし |
原因
マネージド コードは、IntPtr を使用してネイティブ リソースにアクセスします。
規則の説明
マネージド コードで IntPtr
を使用すると、セキュリティ上の問題および信頼性の問題が発生する可能性があります。 IntPtr
のすべての使用状況をレビューして、SafeHandle または類似のテクノロジに置き換える必要があるかどうかを判断してください。 マネージド コードが所有していると見なされるネイティブ リソース (メモリ、ファイル ハンドル、ソケットなど) を IntPtr
が表している場合は、問題が発生します。 マネージド コードがリソースを所有している場合は、関連付けられているネイティブ リソースも解放する必要があります。そうしないと、リソース リークが発生する可能性があるためです。
このようなシナリオでは、マルチスレッド アクセスが IntPtr
に許可されており、IntPtr
で表されるリソースを解放する方法が用意されている場合に、セキュリティや信頼性の問題も発生し ます。 これらの問題では、リソースの解放時に IntPtr
値がリサイクルされ、他のスレッドでリソースが同時に使用されます。 これにより、1 つのスレッドが、不適切なリソースに関連付けられたデータの読み取りまたは書き込みを行うことができる競合状態が発生する可能性があります。 たとえば、型が OS ハンドルを IntPtr
として格納し、Close と、そのハンドルを同時に使用する他のいずれかのメソッドの両方をユーザーが同時に呼び出すことができる場合は、何らかの同期を行わないと、ハンドルのリサイクルの問題がコードに発生します。
このハンドルのリサイクルの問題は、データの破損や、多くの場合、セキュリティの脆弱性を引き起こす可能性があります。 SafeHandle
とその兄弟クラス CriticalHandle は、リソースへのネイティブ ハンドルをカプセル化して、このようなスレッド処理の問題を回避できるようにするメカニズムを提供します。 さらに、SafeHandle
とその兄弟クラス CriticalHandle
を使用して、他のスレッド処理の問題に対応することもできます。たとえば、ネイティブ メソッドの呼び出しへのネイティブ ハンドルのコピーを含むマネージド オブジェクトの有効期間を慎重に制御できます。 この状況では、多くの場合、GC.KeepAlive
への呼び出しを削除できます。 SafeHandle
および CriticalHandle
(影響がより小さい) の使用時に発生するパフォーマンスのオーバーヘッドは、多くの場合、慎重な設計によって削減できます。
違反の修正方法
IntPtr
の使用を SafeHandle
に切り替えて、ネイティブ リソースへのアクセスを安全に管理します。 例については、SafeHandle のリファレンス記事を参照してください。
どのようなときに警告を抑制するか
この警告は抑制しないでください。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示