다음을 통해 공유


SafeHandle을 사용하여 네이티브 리소스를 캡슐화하십시오.

업데이트: 2007년 11월

TypeName

UseSafeHandleToEncapsulateNativeResources

CheckId

CA2006

범주

Microsoft.Reliability

변경 수준

주요 변경 아님

원인

관리 코드에서 IntPtr를 사용하여 네이티브 리소스에 액세스합니다.

규칙 설명

관리 코드에 IntPtr를 사용하는 것은 잠재적인 보안 및 안정성 문제를 나타냅니다. IntPtr를 사용할 때마다 SafeHandle 또는 유사한 기술을 대신 사용해야 하는지 여부를 결정하도록 검토해야 합니다. 관리 코드가 소유해야 하는 일부 네이티브 리소스(메모리, 파일 핸들, 소켓 등)를 IntPtr로 표시하는 경우 문제가 발생합니다. 즉, 리소스를 해제하는 데 관리 코드가 필요하지만 리소스를 해제하지 못하면 리소스가 누수될 수 있습니다.

이런 경우 IntPtr와 IntPtr로 표시되는 리소스를 해제하는 방법에 대해 다중 스레드 액세스가 허용되는 경우 다중 스레드 액세스 보안 또는 안정성에도 문제가 있습니다. 이러한 문제는 다른 스레드에서 리소스를 동시에 사용하면서 리소스를 해제할 때 IntPtr 값을 재활용함으로써 한 스레드가 잘못된 리소스와 관련된 데이터를 읽거나 쓰게 되는 경합 상태가 발생하게 됩니다. 예를 들어, OS 핸들을 IntPtr로 저장하고 어떠한 종류의 동기화도 없이 다른 사용자가 이 핸들을 사용하여 동시에 Close 메서드 및 다른 메서드를 호출할 수 있는 경우 코드에 핸들 재활용 문제가 발생합니다.

이 경우 데이터가 손상되고 종종 보안상 위험합니다. SafeHandle 및 형제 클래스 CriticalHandle은 스레딩 문제를 피할 수 있도록 기본 핸들을 리소스에 캡슐화할 수 있는 메커니즘을 제공합니다. 또한 네이티브 메서드 호출에 대해 기본 핸들의 복사본이 포함된 관리되는 개체의 수명을 자세히 제어해야 하는 등의 다른 스레딩 문제의 경우에도 SafeHandle 및 형제 클래스인 CriticalHandle을 사용할 수 있습니다. 이러한 상황에서는 GC.KeepAlive에 대한 호출을 종종 제거할 수 있습니다. SafeHandle과 이보다 낮은 수준의 CriticalHandle을 사용하면 암시적으로 성능 오버헤드가 발생할 수 있습니다. 따라서 디자인 단계에서부터 이러한 문제를 피할 수 있도록 해야 합니다.

위반 문제를 해결하는 방법

IntPtr 사용을 SafeHandle로 변환하여 네이티브 리소스에 대한 액세스를 안전하게 관리합니다.

경고를 표시하지 않는 경우

이 경고는 반드시 표시해야 합니다.