Share via


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 のリファレンス記事を参照してください。

どのようなときに警告を抑制するか

この警告は抑制しないでください。

関連項目