CA2006: используйте SafeHandle для инкапсуляции машинных ресурсов

Товар Значение
Идентификатор правила CA2006
Категория Microsoft.Reliability
Критическое изменение Не критическое

Причина

Управляемый код используется IntPtr для доступа к собственным ресурсам.

Описание правила

Использование управляемого IntPtr кода может указывать на потенциальную проблему безопасности и надежности. Все виды использования IntPtr должны быть рассмотрены для определения того, требуется ли использование SafeHandle той или иной технологии. Проблемы возникают, если IntPtr представляет некоторый собственный ресурс, например память, дескриптор файла или сокет, который управляемый код считается владельцем. Если управляемый код владеет ресурсом, он также должен освободить собственные ресурсы, связанные с ним, так как сбой этого приведет к утечке ресурсов.

В таких сценариях проблемы безопасности или надежности также будут существовать, если разрешен IntPtr многопоточный доступ и способ освобождения ресурса, представленного предоставленным IntPtr . Эти проблемы связаны с повторной IntPtr переработкой значения в выпуске ресурса, а одновременное использование ресурса выполняется в другом потоке. Это может привести к условиям гонки, когда один поток может считывать или записывать данные, связанные с неправильным ресурсом. Например, если тип сохраняет дескриптор ОС как IntPtr дескриптор и позволяет пользователям вызывать как Close, так и любой другой метод, который использует эту обработку одновременно и без какой-либо синхронизации, код имеет проблему с перезапуском.

Эта проблема с переработкой может привести к повреждению данных и, как правило, уязвимости безопасности. SafeHandle и его одноуровневый класс CriticalHandle предоставляют механизм для инкапсулирования собственного дескриптора к ресурсу, чтобы избежать таких проблем с потоком. Кроме того, можно использовать SafeHandle и его одноуровневый класс CriticalHandle для других проблем с потоком, например для тщательного управления временем существования управляемых объектов, содержащих копию собственного дескриптора через вызовы собственных методов. В этой ситуации часто можно удалять вызовы GC.KeepAlive. Затраты на производительность, которые возникают при использовании SafeHandle и, в меньшей степени, CriticalHandleчасто могут быть сокращены с помощью тщательного проектирования.

Устранение нарушений

Преобразуйте IntPtr использование для SafeHandle безопасного управления доступом к собственным ресурсам. Примеры см. в справочной SafeHandle статье.

Когда лучше отключить предупреждения

Не подавляйте это предупреждение.

См. также