Набор правил "Расширенные правила определения правильности" для управляемого кода
Набор правил "Расширенные правила определения правильности корпорации Майкрософт" позволяет получить уведомление о максимальном числе ошибок логики и использования платформы при анализе кода.Особое внимание уделяется конкретным сценариям, таким, как COM-взаимодействие и мобильные приложения.Этот набор правил следует включать, если к проекту применим один из этих сценариев, или для поиска дополнительных ошибок в проекте.
В наборе правил "Расширенные правила определения правильности корпорации Майкрософт" содержатся правила из набора "Базовые правила определения правильности корпорации Майкрософт"В наборе базовых правил определения правильности содержатся правила из набора "Минимальные правила и рекомендации корпорации Майкрософт"Дополнительные сведения см. в разделах Набор правил "Базовые правила определения правильности" для управляемого кода и Набор правил "Рекомендуемые правила для управляемого кода".
В следующей таблице описываются все правила в наборе правил "Расширенные правила определения правильности корпорации Майкрософт"
Правило |
Описание |
---|---|
Типы, которым принадлежат освобождаемые поля, должны быть освобождаемыми |
|
Правильно объявите обработчики событий |
|
Пометьте сборки атрибутом AssemblyVersionAttribute |
|
Методы интерфейса должны быть доступны для вызова дочерним типам |
|
Типы, которым принадлежат собственные ресурсы, должны быть высвобождаемыми |
|
Переместите P/Invokes в класс NativeMethods |
|
Не скрывайте методы базового класса |
|
Следует правильно реализовывать IDisposable |
|
Не вызывайте исключения в непредвиденных местах |
|
Избегайте повторяющихся сочетаний клавиш быстрого доступа |
|
Необходимо наличие точек входа P/Invoke |
|
Методы P/Invoke не должны быть видимыми |
|
Типы макета Auto не должны быть видимыми для COM |
|
Вызовите GetLastError сразу после P/Invoke |
|
Базовые типы, относящиеся к типу видимых COM-клиенту, должны быть видимыми для COM |
|
Методы регистрации для COM-клиента должны быть соответствующими |
|
Правильно объявите методы P/Invoke |
|
Удалите пустые методы завершения |
|
Поля типа значения должны быть переносимыми |
|
Объявления P/Invoke должны быть переносимыми |
|
Не блокируйте объекты со слабой идентификацией |
|
Проанализируйте SQL-запросы с целью выявления уязвимостей безопасности |
|
Укажите тип маршалинга для строковых аргументов P/Invoke |
|
Проверьте объявляемые параметры безопасности типов значений |
|
Указатели не должны быть видимыми |
|
Защищенные типы не должны предоставлять поля |
|
Безопасность метода должна быть надмножеством типа |
|
Методы APTCA должны вызывать только методы APTCA |
|
APTCA-типы должны расширять только базовые APTCA-типы |
|
Не используйте косвенное представление методов с запросами компоновки |
|
Запросы компоновки переопределения должны быть идентичны базовым |
|
Поместите уязвимые предложения finally во внешний блок try |
|
Запросы компоновки типа требуют запросы наследования |
|
Типы критической безопасности могут не участвовать в эквивалентности типа |
|
Конструкторы по умолчанию должны быть по меньшей мере такими же критическими, как конструкторы по умолчанию базового типа |
|
Делегаты должны привязываться к методам с согласованной прозрачностью |
|
Методы должны сохранять согласованную прозрачность при переопределении базовых методов |
|
Прозрачные методы должны содержать только проверяемые IL |
|
Прозрачные методы не должны вызывать методы с атрибутом SuppressUnmanagedCodeSecurity |
|
Прозрачный код не должен ссылаться на элементы, критичные в плане безопасности |
|
Прозрачные методы не должны удовлетворять требования LinkDemand |
|
Типы должны быть настолько же критическими, как их базовые типы и интерфейсы. |
|
Прозрачные методы могут не использовать утверждения безопасности |
|
Прозрачные методы не следует вызывать в машинном коде |
|
Следует повторно вызывать исключение для сохранения сведений о стеке |
|
Не освобождайте объекты несколько раз |
|
Встроено инициализируйте статические поля типов, передаваемых по значению |
|
Не помечайте обслуживаемые компоненты атрибутом WebMethod |
|
Освобождаемые поля должны быть освобождены |
|
Не вызывайте переопределяемые методы в конструкторах |
|
Высвобождаемые типы должны объявлять метод завершения |
|
Методы завершения должны вызывать метод завершения базового класса |
|
Применяйте конструкторы сериализации |
|
Перегружать оператор равенства следует в перегрузке ValueType.Equals |
|
Отметьте точки входа Windows Forms меткой STAThread |
|
Пометьте все несериализуемые поля |
|
Вызовите методы базового класса для типов ISerializable |
|
Пометьте типы ISerializable атрибутом SerializableAttribute |
|
Правильно реализуйте методы сериализации |
|
Правильно реализуйте ISerializable |
|
Предоставьте правильные аргументы методам форматирования |
|
Правильно выполните проверку NaN |
|
Перечисляемые типы должны иметь нулевое значение |
|
Перегрузите оператор равенства при перегрузке сложения и вычитания |
|
Не передавайте литералы в виде локализованных параметров |
|
Нормализуйте строки в верхнем регистре |
|
Не игнорируйте результаты метода |
|
Вызов GC.SuppressFinalize должен осуществляться правильно |
|
Свойства не должны возвращать массивы |
|
Проверьте наличие пустых строк путем проверки длины строки |
|
Используйте API-интерфейс только из целевой исполняющей среды |
|
Удалите вызовы GC.KeepAlive |
|
Используйте SafeHandle для инкапсуляции машинных ресурсов |
|
Перехватите исключения, не являющиеся CLS-совместимыми, с помощью общих обработчиков |
|
Не объявляйте изменяемые ссылочные типы, доступные только для чтения |
|
Поля массивов не должны быть доступны только для чтения |
|
Обеспечьте безопасность утверждений |
|
Вызовите GC.KeepAlive при использовании собственных ресурсов |
|
Запечатайте методы, соответствующие частным интерфейсам |
|
Обеспечьте безопасность конструкторов сериализации |
|
Статические конструкторы должны быть частными |
|
Константы критической безопасности должны быть прозрачными |
|
Используйте управляемые эквиваленты API Win32 |
|
Методы Dispose должны вызывать такие же методы базового класса |
|
Методы завершения должны быть защищены |
|
Не уменьшайте видимость унаследованных членов |
|
Члены должны различаться не только возвращаемым типом |
|
Переопределите равенство при перегрузке оператора равенства |
|
Перегрузки операторов должны быть симметричны |
|
Свойства коллекции должны иметь параметр "только для чтения" |
|
Предоставьте методы десериализации для необязательных полей |
|
Реализуйте стандартные конструкторы исключения |
|
Параметры URI не должны быть строками |
|
Возвращаемые значения URI не должны быть строками |
|
Свойства URI не должны быть строками |
|
Перегрузки строковых параметров URI вызывают перегрузки System.Uri |
|
Не используйте перегрузки в интерфейсах, видимых в COM |
|
Не используйте аргументы Int64 для клиентов Visual Basic 6 |
|
Не используйте статические члены в видимых COM типах |
|
Не используйте AutoDual ClassInterfaceType |
|
Видимые COM-типы должны быть создаваемыми |
|
Методы регистрации для COM-клиента не должны быть видимыми |
|
Пометьте интерфейсы ComSource как IDispatch |
|
Избегайте использования не открытых полей в видимых типах значений COM |
|
Пометьте логические аргументы P/Invoke с помощью атрибута MarshalAs |
|
Не используйте приоритет процессов в состоянии ожидания |
|
Не используйте таймеры, препятствующие изменению состояния электропитания |
|
Пометьте сборки атрибутом NeutralResourcesLanguageAttribute |
|
Избегайте вызовов проблемных методов |
|
Не следует обрабатывать нити как потоки |
|
Сборки уровня 2 не должны содержать требования LinkDemand |
|
Элементы не должны иметь конфликтующие пометки прозрачности |
|
Прозрачные методы могут не использовать атрибут HandleProcessCorruptingExceptions |
|
Прозрачный код не должен быть защищен с помощью требований LinkDemand |
|
Прозрачные методы не должны использовать требования безопасности |
|
Прозрачный код не должен загружать сборки из массивов байтов |
|
Прозрачные методы не должны быть снабжены атрибутом SuppressUnmanagedCodeSecurityAttribute |
|
Литералы должны иметь правильное написание |
|
Неконстантные поля должны быть скрыты |
|
Не помечайте перечисления атрибутом FlagsAttribute |
|
Переопределите GetHashCode при переопределении Equals |
|
Не создавайте исключения в предложениях исключений |
|
Для перезагрузок оператора существуют дополнения с именами |
|
Не поставляйте невыпущенные форматы ресурсов |
|
Используйте параметры для аргументов переменной |
|
В операциях не должно быть переполнений |
|
Передавайте объекты System.Uri вместо строк |
|
Синтаксический анализ строковых литералов атрибута должен осуществляться правильно |