共用方式為


使用 SafeHandle 封裝原生資源

更新:2007 年 11 月

型別名稱

UseSafeHandleToEncapsulateNativeResources

CheckId

CA2006

分類

Microsoft.Reliability

中斷變更

非中斷

原因

Managed 程式碼使用 IntPtr 存取原生資源。

規則描述

在 Managed 程式碼中使用 IntPtr 可能會有潛在的安全性和可靠性問題。必須檢閱所有使用 IntPtr 的情況,判斷是否需要在該處使用 SafeHandle (或類似技術)。如果 IntPtr 代表某些應是 Managed 程式碼擁有的原生資源 (如記憶體、檔案控制代碼、通訊端等),便會發生問題。換言之,Managed 程式碼必須要釋放資源,而如果未能釋放就會造成資源流失。

在這類案例中,如果允許對 IntPtr 進行多執行緒存取,而 IntPtr 又代表著某種釋放資源的方法,也會存在安全性和可靠性問題。這些問題牽涉到當其他執行緒正在使用該資源的同時,回收運用資源釋放的 IntPtr 值會造成競爭情況,使其中一個執行緒可能會讀取或寫入與錯誤資源相關聯的資料。例如,若您的型別將 OS 控制代碼儲存為 IntPtr,並且允許使用者使用該控制代碼同時呼叫 Close 和任何其他方法 (未經同步處理),則您的程式碼會有控制代碼回收問題。

這個控制代碼回收問題會導致資料損毀,還會時常產生安全性弱點。SafeHandle 及其同層級類別 (Class) CriticalHandle 會提供一種封裝資源原生控制代碼的機制,可以避免這類執行緒問題。此外,您還可以將 SafeHandle 及其同層級類別 CriticalHandle 用於處理其他執行緒問題,例如,對包含呼叫原生方法之原生控制代碼複本的 Managed 物件,小心控制它們的存留期 (Lifetime)。在此情況下,您通常可以移除對 GC.KeepAlive 的呼叫。使用 SafeHandle 也會造成一些效能上的額外負荷,而使用 CriticalHandle 的情況會稍微好一些,透過小心設計就可以時常減少額外負擔。

如何修正違規

將 IntPtr 用法轉換成 SafeHandle,以便安全地管理原生資源的存取。

隱藏警告的時機

您不應該隱藏這項警告。