CA2006:使用 SafeHandle 封装本机资源
适用范围:Visual Studio
Visual Studio for Mac
Visual Studio Code
项 | “值” |
---|---|
RuleId | CA2006 |
Category | Microsoft.Reliability |
重大更改 | 非中断 |
原因
托管代码使用 IntPtr 访问本机资源。
规则说明
在托管代码中使用 IntPtr
可能意味着潜在的安全性和可靠性方面的问题。 必须检查所有使用 IntPtr
之处,以确定是否需要在该处使用 SafeHandle 或类似的技术。 如果 IntPtr
表示托管代码要拥有的某些本机资源(例如内存、文件句柄或套接字),则会出现问题。 如果托管代码拥有资源,则还必须释放与之关联的本机资源,因为如果不这样做,将导致资源泄漏。
在这种情况下,如果允许对 IntPtr
进行多线程访问,并且提供了由 IntPtr
表示的一种释放资源的方法,则也可能存在安全性或可靠性问题。 这些问题涉及在资源释放时回收 IntPtr
值,且同时在另一个线程上使用该资源。 这可能导致争用条件,其中一个线程可以读取或写入与错误资源关联的数据。 例如,如果类型将 OS 句柄存储为 IntPtr
,并允许用户同时调用 Close 和任何其他同时使用该句柄的方法,且没有某种同步,则代码就存在句柄回收问题。
此句柄回收问题可能会导致数据损坏,并频繁出现安全漏洞。 SafeHandle
及其同级类 CriticalHandle 提供了一种机制,用于封装资源的本机句柄,以避免此类线程问题。 此外,可以使用 SafeHandle
及其同级类 CriticalHandle
来处理其他线程问题,例如,通过调用本机方法,仔细控制包含本机句柄副本的托管对象的生存期。 在这种情况下,通常可以删除对 GC.KeepAlive
的调用 。 使用 SafeHandle
(在较小程度上)和 CriticalHandle
时产生的性能开销,可以通过仔细的设计来频繁减少。
如何解决冲突
将 IntPtr
使用情况转换为 SafeHandle
,以安全地管理对本机资源的访问。 有关示例,请参阅 SafeHandle 参考文章。
何时禁止显示警告
请勿禁止显示此警告。