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 статье.
Когда лучше отключить предупреждения
Не подавляйте это предупреждение.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по