Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Анализ кода .NET предусматривает правила, предназначенные для улучшения качества кода. Они разбиты по таким категориям, как разработка, глобализация, производительность и безопасность. Некоторые правила относятся к использованию API .NET, другие — к общему качеству кода.
Индекс правил
В следующей таблице перечислены правила анализа качества кода.
| Идентификаторы правил и предупреждения | Description |
|---|---|
| CA1000: не объявляйте статические элементы в универсальных типах | При вызове статического элемента универсального типа нужно указать аргумент этого типа. При вызове экземплярного универсального члена, не поддерживающего вывод типов, для этого члена необходимо указать аргумент типа. В этих двух случаях синтаксис для определения аргумента типа различен, и его можно легко спутать. |
| CA1001: типы, которым принадлежат освобождаемые поля, должны быть освобождаемыми | В классе объявлено и реализовано поле экземпляра типа System.IDisposable, однако сам класс не реализует интерфейс IDisposable. Класс, в котором объявляется поле IDisposable, неявно владеет неуправляемым ресурсом и должен реализовывать интерфейс IDisposable. |
| CA1002: не следует раскрывать универсальные списки | System.Collections.Generic.List<(Of <(T>)>) — это универсальная коллекция, предназначенная для производительности, а не наследования. Следовательно, List не содержит виртуальных членов. Вместо этого следует предоставлять обобщённые коллекции, предназначенные для наследования. |
| CA1003: Используйте экземпляры обобщённых обработчиков событий | Тип содержит делегат, возвращающий void, с сигнатурой, содержащей два параметра (первый — объект, а второй — тип, совместимый с EventArgs), а содержащая его сборка предназначена для платформы Microsoft .NET Framework 2.0. |
| CA1005: не используйте слишком много параметров в универсальных типах | Чем больше параметров типов содержит универсальный тип, тем сложнее знать и запоминать, что представляет каждый параметр типа. Обычно это очевидно при одном параметре типа, как в List<T>, и в определённых случаях при двух параметрах типа, как в Dictionary<TKey, TValue>. Если же используется более двух параметров типов, многие пользователи начинают испытывать большие трудности. |
| CA1008: перечисления должны иметь нулевое значение | Значение по умолчанию неинициализированного перечисления, как и других типов значений, равно нулю. Перечисление, не помеченное атрибутом Flags, должно определять элемент с нулевым значением, чтобы значение по умолчанию было допустимым значением этого перечисления. Если перечисление с примененным атрибутом FlagsAttribute определяет член с нулевым значением, для него должно быть задано имя None, свидетельствующее о том, что в перечислении не были заданы значения. |
| CA1010: коллекции должны реализовывать универсальный интерфейс | Чтобы расширить возможности использования коллекции, реализуйте один из универсальных интерфейсов коллекции. Затем данную коллекцию можно использовать для заполнения универсальных типов коллекции. |
| CA1012: у абстрактных типов не должно быть открытых конструкторов | Конструкторы абстрактных типов могут быть вызваны только производными типами. Поскольку открытые конструкторы создают экземпляры данного типа, а экземпляры абстрактного типа создавать нельзя, абстрактный тип с открытым конструктором спроектирован неправильно. |
| CA1014: помечайте сборки атрибутом CLSCompliantAttribute | Спецификация среды CLS определяет ограничения по именованию, типам данных и правилам, которым должны соответствовать сборки, предназначенные для использования в нескольких языках программирования. Хорошее проектирование требует, чтобы все сборки явно указывали соответствие CLS с помощью атрибута CLSCompliantAttribute. Если этот атрибут у сборки отсутствует, сборка несовместима. |
| CA1016: помечать сборки атрибутом AssemblyVersionAttribute | .NET использует номер версии для уникальной идентификации сборки и привязки к типам в сборках со строгими именами. Номер версии используется наряду с политикой версий и издателя. По умолчанию приложения выполняются только с версией сборки, которая использовалась для их построения. |
| CA1017: помечайте сборки атрибутом ComVisibleAttribute | Атрибут ComVisibleAttribute определяет порядок обращения клиентов COM к управляемому коду. Согласно принципам хорошего проектирования, сборки должны явно указывать видимость для COM. Можно задать видимость COM для всей сборки, а затем переопределить ее для отдельных типов и элементов типов. Если атрибут отсутствует, содержимое сборки будет видимым клиентам COM. |
| CA1018: Помечайте атрибуты атрибутом AttributeUsageAttribute | При определении настраиваемого атрибута его нужно пометить атрибутом AttributeUsageAttribute, чтобы указать, где можно применять этот настраиваемый атрибут в исходном коде. Допустимое положение атрибута в коде зависит от значения атрибута и его применения. |
| CA1019: Определите средства доступа для аргументов атрибута | Атрибуты могут определять обязательные аргументы, которые должны быть указаны при применении атрибута к целевому объекту. Они также известны как позиционные аргументы, поскольку предоставляются для конструкторов атрибутов в качестве позиционных параметров. Для каждого обязательного аргумента атрибут должен предоставлять соответствующее свойство, доступное только для чтения, чтобы извлечь значение аргумента во время выполнения. Кроме того, атрибуты могут определять дополнительные параметры, известные как именованные аргументы. Эти аргументы предоставляются для конструкторов атрибутов по имени и должны иметь соответствующее свойство чтения/записи. |
| CA1021: Не используйте параметры out | Передача типов по ссылке (с помощью out или ref) требует опыта работы с указателями, понимания различий между типами-значениями и ссылочными типами, а также умения работать с методами, возвращающими несколько значений. Кроме того, далеко не все понимают разницу между параметрами out и ref. |
| CA1024: используйте свойства, если это уместно | Имя открытого или защищенного метода начинается с Get, он не принимает параметры и возвращает значение, не являющееся массивом. Возможно, этот метод — хороший кандидат на преобразование в свойство. |
| CA1027: Пометьте перечисления атрибутом FlagsAttribute | Перечисление является типом значения, которое определяет набор связанных именованных констант. Атрибут FlagsAttribute применяется к перечислению, когда его именованные константы могут быть объединены осмысленным образом. |
| CA1028: хранилище перечислений должно иметь тип Int32 | Перечисление является типом значения, которое определяет набор связанных именованных констант. По умолчанию для хранения значения константы используется тип данных System.Int32. Этот базовый тип можно изменить, но это не требуется и в большинстве случаев не рекомендуется. |
| CA1030: Используйте события, когда это уместно | Это правило обнаруживает методы, имена которых обычно используются для обозначения событий. Если метод вызывается в ответ на четко определенное изменение состояния, то этот вызов должен осуществляться с помощью обработчика событий. Объекты, вызывающие методы, должны создавать события, а не вызывать методы напрямую. |
| CA1031: не перехватывайте типы общих исключений | Общие исключения не должны перехватываться. Перехватите более конкретное исключение или повторно выбросьте общее исключение в качестве последней инструкции в блоке catch. |
| CA1032: реализуйте стандартные конструкторы исключения | Отсутствие полного набора конструкторов может затруднить правильную обработку исключений. |
| CA1033: Методы интерфейса должны вызываться дочерними типами | Незапечатанный тип, доступный для внешнего кода, предоставляет явную реализацию метода открытого интерфейса и не предоставляет доступный для внешнего кода альтернативный метод с тем же именем. |
| CA1034: вложенные типы не должны быть видимыми | Вложенный тип — это тип, объявленный внутри области другого типа. Вложенные типы удобно использовать для инкапсуляции закрытых сведений о реализациях содержащего их типа. При использовании для этой цели вложенные типы не должны быть доступны извне. |
| CA1036: Переопределите методы в типах, поддерживающих сравнение | Открытый или защищенный тип реализует интерфейс System.IComparable. Он не переопределяет метод Object.Equals и не перегружает языковые операторы равенства, неравенства, «меньше» или «больше». |
| CA1040: избегайте пустых интерфейсов | Интерфейсы определяют члены, предоставляющие поведение или соглашение об использовании. Функциональность, описанная интерфейсом, может быть использована любым типом вне зависимости от расположения типа в иерархии интерфейса. Тип реализует интерфейс путем предоставления реализаций для членов интерфейса. Пустой интерфейс не определяет никаких элементов, поэтому он не определяет контракт, который можно реализовать. |
| CA1041: укажите сообщение ObsoleteAttribute | Тип или элемент помечен атрибутом System.ObsoleteAttribute, для которого не указано свойство ObsoleteAttribute.Message. При компиляции типа или элемента, помеченного атрибутом ObsoleteAttribute, отображается текст свойства Message этого атрибута. Предоставляет пользователю информацию об устаревшем типе или элементе. |
| CA1043: используйте целый или строковый аргумент для индексаторов | Индексаторы (индексированные свойства) должны использовать для индекса целочисленные или строковые типы. Эти типы обычно используются для индексации структур данных и повышения удобства использования библиотеки. Тип Object следует использовать только в том случае, если во время разработки невозможно указать определенный целочисленный или строковый тип. |
| CA1044: Свойства не должны быть предназначены только для записи | Несмотря на то, что допустимо, а часто и необходимо иметь свойство, доступное только на чтение, рекомендации по разработке запрещают использование свойств, доступных только на запись. Это связано с тем, что если позволить пользователю задать значение, а затем запретить ему просматривать это значение, то таким образом не будет обеспечиваться какая-либо безопасность. Кроме того, при отсутствии доступа на чтение нельзя просмотреть состояние общих объектов, что снижает их полезность. |
| CA1045: Не передавайте типы по ссылке | Передача типов по ссылке (с помощью out или ref) требует опыта работы с указателями, понимания различий между типами-значениями и ссылочными типами, а также умения работать с методами, имеющими несколько возвращаемых значений. Архитекторам, разрабатывающим библиотеки для широкого использования, не следует рассчитывать, что пользователи отлично разбираются в использовании параметров out и ref. |
| CA1046: не перегружайте оператор равенства для ссылочных типов | Для ссылочных типов реализация оператора равенства по умолчанию почти всегда корректна. По умолчанию две ссылки равны, если они указывают на один объект. |
| CA1047: не объявляйте защищенные элементы в запечатанных типах | Типы объявляют защищённые члены, чтобы производные типы могли иметь к ним доступ или переопределять их. По определению наследовать запечатанные типы нельзя; это означает, что вызов защищенных методов для запечатанных типов невозможен. |
| CA1050: Объявлять типы в пространствах имён | Типы объявляются в пространствах имен во избежание конфликтов имен и с целью упорядочения связанных типов в иерархии объектов. |
| CA1051: Не объявляйте видимые поля экземпляра | Поля следует использовать главным образом в качестве детали реализации. Поля должны быть помечены как private или internal и должны быть представлены с помощью свойств. |
| CA1052: типы со статическими заполнителями должны быть запечатаны | Общедоступный или защищенный тип содержит только статические члены и объявлен без модификатора sealed (C# Reference) (NotInheritable). Тип, который не предназначен для наследования, следует пометить модификатором sealed, чтобы предотвратить его использование в качестве базового типа. |
| CA1053: типы-контейнеры для статических членов не должны иметь конструкторов | В открытом или вложенном открытом типе объявляются только статические элементы и имеется открытый или защищенный конструктор по умолчанию. Конструктор не нужен, поскольку при вызове статических членов не требуется экземпляр типа. Для обеспечения безопасности перегруженная строка должна вызывать перегрузку универсального кода ресурса (URI), используя строковый аргумент. |
| CA1054: параметры URI не должны быть строками | Если метод принимает строковое представление универсального кода ресурса (URI), необходимо предоставить соответствующую перегрузку, принимающую экземпляр класса URI, который предоставляет эти услуги безопасным образом. |
| CA1055: возвращаемые значения URI не должны быть строками | В этом правиле предполагается, что метод возвращает универсальный код ресурса (URI). В строковых представлениях кода URI часто встречаются ошибки синтаксического анализа и кодирования, которые могут привести к уязвимостям системы безопасности. Класс System.Uri предоставляет аналогичные услуги более надежным и безопасным способом. |
| CA1056: свойства URI не должны быть строками | В этом правиле предполагается, что свойство является универсальным кодом ресурса (URI). В строковых представлениях кода URI часто встречаются ошибки синтаксического анализа и кодирования, которые могут привести к уязвимостям системы безопасности. Класс System.Uri предоставляет аналогичные услуги более надежным и безопасным способом. |
| CA1058: типы не должны расширять определенные базовые типы | Видимый извне тип расширяет некоторые базовые типы. Используйте только один вариант. |
| CA1060: переместите P/Invokes в класс NativeMethods | Методы вызова платформы, такие как методы, помеченные атрибутом System.Runtime.InteropServices.DllImportAttribute, или методы, объявленные с использованием ключевого слова Declare в Visual Basic, обеспечивают доступ к неуправляемому коду. Эти методы должны относиться к классу NativeMethods, SafeNativeMethods или UnsafeNativeMethods. |
| CA1061: не следует скрывать методы базового класса | Метод в базовом типе скрывается методом с тем же именем в производном типе, если сигнатура параметров производного метода отличается только типами, которые являются менее производными, чем соответствующие типы в сигнатуре параметров базового метода. |
| CA1062: проверьте аргументы открытых методов | Все ссылочные аргументы, передаваемые в видимые для внешнего кода методы, должны проверяться на равенство значению NULL. |
| CA1063: правильно реализуйте IDisposable | Все типы IDisposable должны корректно реализовывать шаблон Dispose. |
| CA1064: исключения должны быть открытыми | Внутреннее исключение доступно только в собственной внутренней области видимости. После выхода исключения за пределы внутренней области для перехвата исключения можно использовать только базовое исключение. Если внутреннее исключение унаследовано от Exception, SystemException или ApplicationException, внешний код не имеет достаточных данных для обработки этого исключения. |
| CA1065: не генерируйте исключения в непредусмотренных местах | Метод генерирует исключение, хотя не предполагается, что он будет это делать. |
| CA1066: Реализуйте IEquatable при переопределении Equals | Тип значения переопределяет метод Equals, но не реализует IEquatable<T>. |
| CA1067: Переопределяйте Equals при реализации IEquatable | Тип реализует IEquatable<T>, но не переопределяет метод Equals. |
| CA1068: параметры CancellationToken должны быть последними | Метод имеет параметр CancellationToken, который не является последним параметром. |
| CA1069: перечисления не должны иметь повторяющиеся значения | Перечисление содержит несколько элементов, которым явным образом присвоено одно и то же значение константы. |
| CA1070: не объявляйте поля событий как виртуальные | Событие, подобное полю, было объявлено виртуальным. |
| CA1200: избегайте использования тегов cref с префиксом | Атрибут cref в теге XML-документации означает "code reference" (кодовая ссылка). Он указывает, что текст внутри тега представляет собой элемент кода, например тип, метод или свойство. Старайтесь не использовать теги cref с префиксами, так как это не позволяет компилятору проверять ссылки. Это также мешает поиску и обновлению этих символьных ссылок во время рефакторинга в интегрированной среде разработки (IDE) Visual Studio. |
| CA1303: не следует передавать литералы в виде локализованных параметров | Видимый извне метод передает строковый литерал в виде параметра конструктору .NET или методу, и эта строка должна быть локализуемой. |
| CA1304: Укажите CultureInfo | Метод или конструктор вызывает член, для которого существует перегрузка, принимающая параметр System.Globalization.CultureInfo, и при этом метод или конструктор не вызывает перегрузку, принимающую параметр CultureInfo. Если объект CultureInfo или System.IFormatProvider не предоставляется, значение по умолчанию, поставляемое перегруженным членом, может не оказать ожидаемого воздействия во всех языковых стандартах. |
| CA1305: укажите IFormatProvider | Метод или конструктор вызывает один или несколько членов, имеющих перегрузки, принимающие параметр System.IFormatProvider, но не вызывает перегрузку, принимающую параметр IFormatProvider. Если объект System.Globalization.CultureInfo или IFormatProvider не указан, значение по умолчанию, предусмотренное перегруженным членом, может не дать нужного результата во всех языковых стандартах. |
| CA1307: укажите StringComparison для ясности | В операции сравнения строк используется перегрузка метода, которая не задает параметр StringComparison. |
| CA1308: Нормализация строк к верхнему регистру | Строки следует нормализовать в верхний регистр. Существует небольшая группа символов, которые после преобразования в нижний регистр не могут участвовать в круговом перемещении. |
| CA1309: используйте порядковое сравнение StringComparison | Операция сравнения строк, не являющаяся лингвистической, не задает для параметра StringComparison ни значения Ordinal, ни значения OrdinalIgnoreCase. Если явно задать параметру значение StringComparison.Ordinal или StringComparison.OrdinalIgnoreCase, код часто начинает работать быстрее, корректнее и надежнее. |
| CA1310: укажите StringComparison для обеспечения корректности | Операция сравнения строк использует перегрузку метода, в которой не указан параметр StringComparison, и поэтому по умолчанию выполняет сравнение строк с учетом языковых и региональных параметров. |
| CA1311: укажите язык и региональные параметры или используйте инвариантную версию | Укажите культуру или используйте инвариантную культуру, чтобы избежать неявной зависимости от текущей культуры при вызове ToUpper или ToLower. |
| CA1401: методы P/Invoke не должны быть общедоступными | Открытый или защищенный метод в открытом типе имеет атрибут System.Runtime.InteropServices.DllImportAttribute (также реализуется в Visual Basic с помощью ключевого слова Declare). Такие методы не следует делать видимыми. |
| CA1416: проверка совместимости платформы | При использовании в компоненте API, зависящего от платформы, код больше не будет работать на всех платформах. |
CA1417: не используйте OutAttribute в параметрах строки для P/Invokes |
Строковые параметры, передаваемые по значению с OutAttribute, могут привести к нестабильной работе среды выполнения, если строка является интернированной строкой. |
| CA1418: Используйте допустимую строку платформы | Анализатор совместимости платформ требует указать действительное имя и версию платформы. |
CA1419: обеспечьте наличие конструктора без параметров, который имеет такую же видимость, что и содержащий тип, для конкретных типов, производных от System.Runtime.InteropServices.SafeHandle |
Предоставление для типа, производного от System.Runtime.InteropServices.SafeHandle, конструктора без параметров с уровнем доступа не ниже, чем у содержащего типа, обеспечивает более высокую производительность и более удобную работу с решениями межоперационного взаимодействия, создаваемыми генератором исходного кода. |
| CA1420: Свойство, тип или атрибут требует маршалинга во время выполнения | Использование функций, требующих маршаллинга среды выполнения при отключении маршаллинга среды выполнения, приведет к исключениям среды выполнения. |
| CA1421: Метод использует маршалинг во время выполнения, если применён атрибут DisableRuntimeMarshallingAttribute | Метод использует маршаллирование среды выполнения, а маршаллирование среды выполнения явно отключено. |
| CA1422: проверка совместимости платформы | Не рекомендуется вызывать API, устаревший в данной ОС (версии) с сайта вызова, доступного из этой ОС (версии). |
| CA1501: избегайте излишнего наследования | Тип расположен глубже четырех уровней в иерархии наследования. Глубокие иерархии вложенных типов трудно отслеживать, понимать и поддерживать. |
| CA1502: избегайте чрезмерной сложности | Это правило измеряет число линейно независимых путей в методе, которое определяется числом и сложностью условных ветвей. |
| CA1505: избегайте кода, неудобного для поддержки | Тип или метод имеет низкий индекс обслуживаемости. Низкий индекс удобства поддержки означает, что тип или метод, вероятно, трудно поддерживать, поэтому их следует переработать. |
| CA1506: избегайте чрезмерного соединения классов | Данное правило измеряет взаимозависимость классов путем подсчета количества уникальных ссылок на типы, содержащихся в типе или методе. |
| CA1507: вместо строки используйте nameof | Строковый литерал используется в качестве аргумента, где можно использовать выражение nameof. |
| CA1508: избегайте мертвого условного кода | Метод содержит условную конструкцию, которая во время выполнения всегда принимает значение true или false. Это приводит к неиспользуемому коду в ветви false условия. |
| CA1509: недопустимая запись в файле конфигурации метрик кода | Правила метрик кода, такие как CA1501, CA1502, CA1505 и CA1506, предоставили файл конфигурации с именем CodeMetricsConfig.txt, который имеет недопустимую запись. |
| CA1510: Используйте вспомогательный метод throw для ArgumentNullException | Вспомогательные методы throw проще и эффективнее, чем блоки if, создающие новый экземпляр исключения. |
| CA1511: Используйте вспомогательный метод для создания исключения ArgumentException | Вспомогательные методы throw проще и эффективнее, чем блоки if, создающие новый экземпляр исключения. |
| CA1512: Используйте вспомогательный метод throw для ArgumentOutOfRangeException | Вспомогательные методы throw проще и эффективнее, чем блоки if, создающие новый экземпляр исключения. |
| CA1513: использование вспомогательной функции objectDisposedException | Вспомогательные методы throw проще и эффективнее, чем блоки if, создающие новый экземпляр исключения. |
| CA1514: избегайте избыточного аргумента длины | Аргумент избыточной длины используется при срезе в конец строки или буфера. Вычисляемая длина может быть подвержена ошибкам и также не требуется. |
| CA1515: рекомендуется сделать общедоступные типы внутренними | В отличие от библиотеки классов, на API приложения обычно не ссылаются публично, поэтому типы можно пометить как internal. |
| CA1516: использование кроссплатформенных встроенных функций | Это правило обнаруживает использование встроенных функций для конкретной платформы, которые можно заменить эквивалентным кроссплатформенным встроенным. |
| CA1700: не следует называть значения перечислений именем "Reserved" | В данном правиле предполагается, что член перечисления, имя которого содержит слово "reserved", не используется в настоящее время, а является местозаполнителем, который будет в дальнейшем переименован или удален. Переименование или удаление элемента — это критическое изменение. |
| CA1707: идентификаторы не должны содержать знак подчеркивания | В соответствии с соглашением имена идентификаторов не могут содержать знак подчеркивания (_). Это правило позволяет проверить пространства имен, типы, элементы и параметры. |
| CA1708: Идентификаторы должны отличаться не только регистром | Идентификаторы пространств имен, типов, членов и параметров не могут различаться только регистром, поскольку языки, ориентированные на общеязыковую среду выполнения (CLR), не обязаны учитывать регистр. |
| CA1710: идентификаторы должны иметь правильные суффиксы | По правилам имена типов, расширяющих определенные базовые типы или реализующих определенные интерфейсы, а также типов, являющихся производными от первых, имеют суффикс, связанный с базовым типом или интерфейсом. |
| CA1711: идентификаторы не должны иметь неверных суффиксов | В соответствии с соглашением об именовании, определенные зарезервированные суффиксы должны добавляться только к именам типов, которые расширяют некоторые базовые типы или реализуют определенные интерфейсы, а также производных от них типов. В именах других типов зарезервированные суффиксы использоваться не должны. |
| CA1712: не добавляйте имя типа перед перечисляемыми значениями | Имена членов перечисления не должны содержать префиксов в виде имени типа, поскольку предполагается, что сведения о типе предоставляются средствами разработки. |
| CA1713: имена событий не должны содержать префикс "before" или "after" | Имя события начинается с Before или After. Чтобы дать имена связанным событиям, возникающим в определенной последовательности, используйте настоящее или прошедшее время, чтобы обозначить положение события в последовательности действий. |
| CA1714: имена перечислений флагов должны быть во множественном числе | Открытое перечисление содержит атрибут System.FlagsAttribute, и имя перечисления не заканчивается на "s". Имена типов, помеченных атрибутом FlagsAttribute, используются во множественном числе, поскольку данный атрибут указывает на возможность задания нескольких значений. |
| CA1715: идентификаторы должны иметь правильные префиксы | Имя доступного для внешнего кода интерфейса не начинается с заглавной буквы "I". Имя параметра универсального типа в доступном для внешнего кода типе или методе не начинается с заглавной буквы "Т". |
| CA1716: идентификаторы не должны совпадать с ключевыми словами | Имя пространства имен или типа совпадает с ключевым словом, зарезервированным в языке программирования. Идентификаторы пространств имен и типов не должны совпадать с ключевыми словами, определенными в языках, ориентированных на общеязыковую среду выполнения (CLR). |
| CA1717: Только перечисления с атрибутом FlagsAttribute должны иметь имена во множественном числе | Согласно правилам именования множественное число имени перечисления указывает, что одновременно можно задать несколько значений перечисления. |
| CA1720: идентификаторы не должны содержать имен типов | Имя параметра в доступном для внешнего кода элементе содержит имя типа данных, или имя доступного для внешнего кода элемента содержит языковое имя типа данных. |
| CA1721: имена свойств не должны совпадать с именами методов get | Имя открытого или защищенного элемента начинается с Get и соответствует имени открытого или защищенного свойства и по другим параметрам. Методы Get и свойства должны иметь имена, позволяющие четко различать их функции. |
| CA1724. Имена типов не должны совпадать с именами пространства имен | Имена типов не должны совпадать с именами пространства имен .NET. Нарушение этого правила приводит к уменьшению функциональности библиотеки. |
| CA1725: имена параметров должны соответствовать базовому объявлению | Согласованность именования параметров в иерархии переопределений повышает удобство использования при переопределении методов. Если имя параметра в производном методе отличается от имени в базовом объявлении, это может вызвать путаницу относительно того, является ли этот метод переопределением базового метода или новой перегрузкой метода. |
| CA1727: Используйте PascalCase для именованных заполнителей | Используйте PascalCase для именованных заполнителей в шаблоне сообщения ведения журнала. |
| CA1801: проверьте неиспользуемые параметры | Сигнатура метода включает параметр, не использующийся в основной части метода. |
| CA1802. Используйте литералы там, где возможно | Поле объявляется статическим и доступным только для чтения (Shared и ReadOnly в Visual Basic) и инициализируется со значением, вычисляемым во время компиляции. Так как значение, назначенное целевому полю, является вычисленным во время компиляции, измените объявление на конст (Const в Visual Basic), чтобы значение вычислялось во время компиляции, а не во время выполнения. |
| CA1805: не делайте лишних инициализаций | Среда выполнения .NET инициализирует все поля объектов ссылочного типа значениями по умолчанию перед вызовом конструктора. В большинстве случаев явная инициализация поля значением по умолчанию является избыточной, что увеличивает затраты на сопровождение и может снизить производительность (например, из-за увеличения размера сборки). |
| CA1806: не игнорируйте результаты метода | Создается, но никогда не используется новый объект, либо вызывается метод, который создает и возвращает новую строку, и такая новая строка никогда не используется, либо метод COM или P/Invoke возвращает HRESULT или код ошибки, который никогда не используется. |
| CA1810: инициализируйте статические поля ссылочного типа встроенными средствами | Если тип объявляет явный статический конструктор, JIT-компилятор добавляет проверку в каждый статический метод и конструктор экземпляра этого типа, чтобы гарантировать, что статический конструктор уже был вызван. Проверки статических конструкторов могут привести к снижению производительности. |
| CA1812: Не используйте внутренние классы, для которых не создаются экземпляры | Экземпляр типа уровня сборки не создается кодом в сборке. |
| CA1813: Избегайте незапечатанных атрибутов | .NET предоставляет методы для извлечения настраиваемых атрибутов. По умолчанию эти методы осуществляют поиск иерархии наследования атрибутов. Если запечатать атрибут, поиск в иерархии наследования выполняться не будет, в результате чего может повыситься производительность. |
| CA1814: используйте ступенчатые массивы вместо многомерных | Ступенчатый массив — это массив, элементами которого являются массивы. Массивы, которые составляют элементы, могут иметь различные размеры, что позволяет экономить пространство для некоторых наборов данных. |
| CA1815: Переопределяйте метод Equals и оператор равенства для типов значений | В унаследованной реализации Equals для типов значений используется библиотека отражения и сравнивается содержимое всех полей. Рефлексия требует больших вычислительных затрат, и сравнивать все поля на равенство может быть необязательным. Если предполагается, что пользователи будут сравнивать, сортировать экземпляры или использовать их в качестве ключей хэш-таблиц, тип значения должен реализовывать Equals. |
| CA1816: вызов GC.SuppressFinalize должен осуществляться правильно | Метод, являющийся реализацией Dispose, не вызывает GC.SuppressFinalize; или метод, не являющийся реализацией Dispose, вызывает GC.SuppressFinalize; или метод вызывает GC.SuppressFinalize и передает объект, отличный от this (Me в Visual Basic). |
| CA1819: свойства не должны возвращать массивы | Массивы, возвращаемые свойствами, не защищены от записи, даже если свойство предназначено только для чтения. Чтобы защитить массив от изменений, свойство должно возвращать копию массива. Как правило, пользователи не осознают негативных последствий для производительности при обращении к такому свойству. |
| CA1820: проверьте наличие пустых строк путем проверки длины строки | Сравнивать строки с использованием свойства String.Length или метода String.IsNullOrEmpty значительно быстрее, чем с помощью Equals. |
| CA1821: удаляйте пустые методы завершения | Если возможно, старайтесь не использовать финализаторы, поскольку из-за отслеживания жизненного срока объектов снижается производительность программы. Пустой финализатор влечет дополнительные накладные расходы и не приносит никакой пользы. |
| CA1822: помечайте члены как статические | Члены, которые не обращаются к данным экземпляра и не вызывают методы экземпляра, можно пометить как static (Shared в Visual Basic). Если пометить методы как статические, компилятор предоставит этим членам невиртуальные места вызова. Это обеспечивает значительное повышение производительности при работе с кодом, для которого важна высокая производительность системы. |
| CA1823: избегайте наличия неиспользованных закрытых полей | Обнаружены закрытые поля, доступ к которым, судя по всему, не предоставляется в сборке. |
| CA1824: Пометить сборки атрибутом NeutralResourcesLanguageAttribute | Атрибут NeutralResourcesLanguage сообщает Resource Manager о языке, использованном для отображения в сборке ресурсов, не зависящих от языка или региональных параметров. Это повышает производительность поиска для первого ресурса, который вы загружаете, и может сократить рабочее множество. |
| CA1825: Избегайте выделения массива нулевой длины | Инициализация массива нулевой длины приводит к выделению лишней памяти. Вместо этого используйте статический выделенный экземпляр пустого массива, вызвав метод Array.Empty. Выделение памяти является общим для всех вызовов этого метода. |
| CA1826: используйте свойство вместо метода Linq Enumerable | Метод LINQ Enumerable использовался для типа, поддерживающего эквивалентное и более эффективное свойство. |
| CA1827: не используйте Count/LongCount, когда можно использовать Any | Использовался метод Count или LongCount, тогда как более эффективным был бы метод Any. |
| CA1828: не используйте CountAsync/LongCountAsync при использовании AnyAsync | Использовался метод CountAsync или LongCountAsync, тогда как более эффективным был бы метод AnyAsync. |
| CA1829: используйте свойство Length/Count вместо метода Enumerable.Count | Метод LINQ Count использовался для типа, поддерживающего эквивалентное и более эффективное свойство Length или Count. |
| CA1830: Предпочитайте строго типизированные перегрузки методов Append и Insert в StringBuilder | Append и Insert предоставляют перегрузки для нескольких типов, помимо типа String. По возможности рекомендуется использовать строго типизированные перегрузки вместо использования ToString() и перегрузки на основе строк. |
| CA1831: используйте AsSpan вместо индексаторов на основе диапазона для строки при необходимости | При использовании в строке индексатора на основе диапазона и неявном присваивании значения типу ReadOnlySpan<char> метод Substring будет использоваться вместо Slice, который создает копию запрошенной части строки. |
| CA1832: используйте AsSpan или AsMemory вместо индексаторов на основе диапазона для получения части ReadOnlySpan или ReadOnlyMemory массива | При использовании в массиве индексатора диапазона и неявного присваивания значения типу ReadOnlySpan<T> или ReadOnlyMemory<T> метод GetSubArray будет использоваться вместо Slice, который создает копию запрошенной части массива. |
| CA1833: Используйте AsSpan или AsMemory вместо индексаторов на основе диапазона для получения части массива в виде Span или Memory. | При использовании в массиве индексатора диапазона и неявного присваивания значения типу Span<T> или Memory<T> метод GetSubArray будет использоваться вместо Slice, который создает копию запрошенной части массива. |
| CA1834: используйте StringBuilder.Append(char) для одно символьных строк |
StringBuilder имеет перегрузку Append, принимающую char в качестве аргумента. Рекомендуется вызывать перегрузку char для повышения производительности. |
CA1835: предпочитайте перегрузки на основе Memory для ReadAsync и WriteAsync |
Stream имеет перегрузку ReadAsync, которая принимает Memory<Byte> в качестве первого аргумента, и перегрузку WriteAsync, которая принимает ReadOnlyMemory<Byte> в качестве первого аргумента. Предпочтительно вызывать перегрузки, работающие с памятью, так как они эффективнее. |
CA1836: используйте IsEmpty вместо Count по возможности |
Используйте свойство IsEmpty, которое более эффективно, чем Count, Length, Count<TSource>(IEnumerable<TSource>) или LongCount<TSource>(IEnumerable<TSource>), чтобы определить, содержит ли объект какие-либо элементы. |
CA1837: используйте Environment.ProcessId вместо Process.GetCurrentProcess().Id |
Environment.ProcessId проще и быстрее, чем Process.GetCurrentProcess().Id. |
CA1838: не используйте параметры StringBuilder для вызовов P/Invoke |
Маршаллинг StringBuilder всегда создает копию буфера в нативном формате, что приводит к нескольким выделениям памяти для одной операции маршаллинга. |
| CA1839: используйте Environment.ProcessPath вместо Process.GetCurrentProcess().MainModule.FileName |
Environment.ProcessPath проще и быстрее, чем Process.GetCurrentProcess().MainModule.FileName. |
| CA1840: используйте Environment.CurrentManagedThreadId вместо Thread.CurrentThread.ManagedThreadId |
Environment.CurrentManagedThreadId компактнее и эффективнее, чем Thread.CurrentThread.ManagedThreadId. |
| CA1841: предпочитайте словари, содержащие методы | Вызов Contains для коллекции Keys или Values нередко может быть более затратным, чем вызов ContainsKey или ContainsValue непосредственно для самого словаря. |
CA1842: не используйте WhenAll с одной задачей |
Использование WhenAll с одной задачей может привести к потере производительности. Вместо этого ожидайте или верните задачу. |
CA1843: не используйте WaitAll с одной задачей |
Использование WaitAll с одной задачей может привести к потере производительности. Вместо этого ожидайте или верните задачу. |
CA1844: предоставление переопределения на основе памяти асинхронных методов при подклассах Stream |
Чтобы повысить производительность, переопределите асинхронные методы на основе памяти при подклассах Stream. Затем реализуйте методы на основе массивов в контексте методов на основе памяти. |
CA1845: использование диапазона string.Concat |
Более эффективно использовать AsSpan и string.Concat, а не Substring и оператор объединения. |
CA1846: предпочитать AsSpan вместо Substring |
Метод AsSpan является более эффективным, чем Substring.
Substring выполняет копирование строк со сложностью O(n), тогда как AsSpan этого не делает и стоимость этого метода константна.
AsSpan также не выполняет выделений памяти в куче. |
| CA1847: Используйте символьный литерал для поиска отдельного символа | Используйте String.Contains(char) вместо String.Contains(string) при поиске одного символа. |
| CA1848: Используйте делегаты LoggerMessage | Для повышения производительности используйте делегатов LoggerMessage. |
| CA1849. Вызов асинхронных методов в методе async | В методе, который уже является асинхронным, вызовы других методов должны соответствовать их асинхронным версиям, если они существуют. |
CA1850: используйте статический метод HashData вместо ComputeHash |
Использование статического метода HashData эффективнее создания экземпляра HashAlgorithm и управления им для вызова ComputeHash. |
CA1851: возможен многократный перебор IEnumerable коллекции |
Возможно многократное перечисление коллекции IEnumerable. Рекомендуется использовать реализацию, которая избегает нескольких перечислений. |
| CA1852: запечатывать внутренние типы | Тип, который недоступен за пределами своей сборки и не имеет подтипов в его содержащей сборке, не запечатан. |
CA1853: ненужный вызов Dictionary.ContainsKey(key) |
Нет необходимости защищать Dictionary.Remove(key) с помощью Dictionary.ContainsKey(key).
Dictionary<TKey,TValue>.Remove(TKey) уже проверяет, существует ли ключ и не вызывается, если он не существует. |
CA1854: Рекомендуется использовать метод IDictionary.TryGetValue(TKey, out TValue) |
Предпочитайте TryGetValue вместо доступа через индексатор словаря, защищенного проверкой ContainsKey.
ContainsKey и индексатор оба ищут ключ, поэтому использование TryGetValue избегает дополнительного поиска. |
| CA1855: Используйте Span<T>.Clear() вместо Span<T>.Fill() | Более эффективно вызвать Span<T>.Clear(), чем вызвать Span<T>.Fill(T), чтобы заполнить элементы span значением по умолчанию. |
| CA1856: неправильное использование атрибута ConstantExpected | Атрибут ConstantExpectedAttribute не применяется правильно к параметру. |
| CA1857: параметр ожидает константы для оптимальной производительности | Недопустимый аргумент передаётся параметру, аннотированному с помощью ConstantExpectedAttribute. |
| CA1858: используйте StartsWith вместо IndexOf | Более эффективно String.StartsWith вызывать, чем String.IndexOf вызывать, чтобы проверить, начинается ли строка с заданным префиксом. |
| CA1859: используйте конкретные типы, если это возможно для повышения производительности | Код использует типы интерфейса или абстрактные типы, что приводит к ненужным вызовам интерфейса или виртуальным вызовам. |
CA1860: избегайте использования Enumerable.Any() метода расширения |
Более эффективно и ясно использовать Length, Countили IsEmpty (если возможно), чем вызывать Enumerable.Any , чтобы определить, имеет ли тип коллекции какие-либо элементы. |
| CA1861: избегайте массивов констант в качестве аргументов | Массивы констант, передаваемые в качестве аргументов, не используются повторно, что подразумевает затраты на производительность. Рассмотрите возможность их извлечения в static readonly поля для повышения производительности. |
CA1862: используйте перегрузки методов сравненияStringComparison для выполнения сравнения строк без учета регистра |
Когда код вызывает ToLower() или ToUpper() для выполнения сравнения строк без учета регистра, происходит ненужное выделение памяти. |
CA1863: используйте CompositeFormat |
Чтобы уменьшить затраты на форматирование, кэшируйте и используйте экземпляр CompositeFormat в качестве аргумента для String.Format или StringBuilder.AppendFormat. |
CA1864: предпочтительно использовать IDictionary.TryAdd(TKey, TValue) метод |
И Dictionary<TKey,TValue>.ContainsKey(TKey), и Dictionary<TKey,TValue>.Add выполняют поиск, что избыточно. Эффективнее вызвать Dictionary<TKey,TValue>.TryAdd, который возвращает значение типа bool, указывающее, было ли значение добавлено.
TryAdd не перезаписывает значение ключа, если ключ уже присутствует. |
| CA1865-CA1867: использование перегрузки char | Перегрузка с параметром char обеспечивает более высокую производительность для строки, состоящей из одного символа. |
CA1868: ненужный вызов Contains для множеств |
И ISet<T>.Add(T), и ICollection<T>.Remove(T) выполняют поиск, поэтому нет необходимости заранее вызывать ICollection<T>.Contains(T). Более эффективно вызывать Add(T) или Remove(T) напрямую, возвращая логическое значение, указывающее, был ли добавлен или удален элемент. |
CA1869: кэширование и повторное использование JsonSerializerOptions экземпляров |
Использование локального экземпляра JsonSerializerOptions сериализации или десериализации может значительно снизить производительность приложения, если код выполняется несколько раз, так как System.Text.Json внутренне кэширует метаданные, связанные с сериализацией, в предоставленный экземпляр. |
CA1870: использование кэшированного экземпляра SearchValues |
Использование кэшированного экземпляра SearchValues<T> является более эффективным, чем передача значений в IndexOfAny или ContainsAny напрямую. |
CA1871: не передавайте Nullable Struct в ArgumentNullException.ThrowIfNull |
ArgumentNullException.ThrowIfNull принимает object, поэтому передача nullable структуры может привести к тому, что значение будет упаковано. |
CA1872: предпочитать Convert.ToHexString и Convert.ToHexStringLower вместо цепочек вызовов на основе BitConverter.ToString |
Используйте Convert.ToHexString или Convert.ToHexStringLower при кодировании байтов в строковое представление в шестнадцатеричном формате. Эти методы более эффективны и требуют меньше выделений памяти, чем использование BitConverter.ToString в сочетании с String.Replace для замены тире и String.ToLower. |
| CA1873: избегайте потенциально дорогостоящего логгирования | Во многих ситуациях ведение журнала отключено или установлено на уровень журнала, который приводит к ненужной оценке аргументов ведения журнала. |
CA1874: Используйте Regex.IsMatch |
Regex.IsMatch проще и быстрее, чем Regex.Match(...).Success. |
CA1875: Используйте Regex.Count |
Regex.Count проще и быстрее, чем Regex.Matches(...).Count. |
| CA1877: используйте перегрузки для Path.Combine или Path.Join. | Когда несколько операций Path.Combine или Path.Join вложены друг в друга, их можно свернуть в одну операцию для повышения производительности и удобочитаемости. |
| CA2000: удалите объекты до того, как будет потеряна область действия | Необходимо явно удалить объект до того, как все ссылки на него окажутся вне области действия, так как может произойти исключительное событие, которое воспрепятствует выполнению метода завершения объекта. |
| CA2002: не блокировать объекты со слабой идентификацией | К объекту со слабой идентификацией может быть получен прямой доступ через границы домена приложения. Поток, пытающийся установить блокировку на объект со слабой идентичностью, может быть заблокирован вторым потоком в другом домене приложения, который удерживает блокировку того же объекта. |
| CA2007: не ожидайте непосредственно задачи | Асинхронный метод напрямую ожидаетTask. Когда асинхронный метод ожидает Task напрямую, продолжение происходит в том же потоке, который создал задачу. Такое поведение может быть дорогостоящим в плане производительности и может привести к взаимоблокировке потока пользовательского интерфейса. Чтобы сообщить о намерении продолжения, рассмотрите возможность вызова метода Task.ConfigureAwait(Boolean). |
| CA2008: не создавайте задачи, не передавая TaskScheduler | Операция создания или продолжения задачи использует перегрузку метода, в которой не указан параметр TaskScheduler. |
| CA2009: не вызывайте ToImmutableCollection для значения типа ImmutableCollection | Метод ToImmutable был без необходимости вызван для неизменяемой коллекции из пространства имен System.Collections.Immutable. |
| CA2011: Не присваивайте значение свойству в его методе set | Свойству было случайно присвоено значение в его собственном аксессоре set. |
| CA2012: правильно используйте ValueTasks | Экземпляры ValueTask, возвращаемые из вызовов элементов, предназначены для непосредственного ожидания. Попытки использовать объект ValueTask несколько раз или напрямую получить доступ к его результату до того, как станет известно, что он завершён, могут привести к исключению или повреждению данных. Игнорируя такую функцию ValueTask, скорее всего, указывает на функциональную ошибку и может снизить производительность. |
| CA2013: не используйте ReferenceEquals с типами значений | Если при сравнении значений с помощью System.Object.ReferenceEquals objA и objB являются типами значений, то перед передачей в метод ReferenceEquals они упаковываются. Это означает, что даже если и objA, и objB представляют один и тот же экземпляр типа значения, метод ReferenceEquals все равно возвращает значение false. |
| CA2014: не используйте stackalloc в циклах. | Пространство стека, выделенное stackalloc, освобождается только в конце вызова текущего метода. Его использование в цикле может привести к неограниченному росту стека и в конечном итоге к переполнению стека. |
| CA2015: не определяйте методы завершения для типов, производных от MemoryManager<T> | Добавление финализатора в тип, производный от MemoryManager<T>, может привести к освобождению памяти, в то время как она все еще используется объектом Span<T>. |
| CA2016: Передавайте параметр CancellationToken методам, которые его принимают | Передайте параметр CancellationToken дальше в методы, которые его принимают, чтобы уведомления об отмене операции корректно передавались, либо явно передайте CancellationToken.None, чтобы указать, что токен намеренно не распространяется. |
| CA2017: Несоответствие количества параметров | Количество параметров, предоставленных в шаблоне сообщения ведения журнала, не соответствует числу именованных заполнителей. |
CA2018: аргумент count в Buffer.BlockCopy должен задавать число байт копирования |
При использовании Buffer.BlockCopy аргумент count указывает число копируемых байт. Использовать Array.Length для аргумента count следует только с массивами с размером элементов ровно один байт. Массивы с однобайтовым размером элементов: byte, sbyte и bool. |
CA2019: ThreadStatic поля не должны использовать встроенную инициализацию |
Поле, помеченное аннотацией, ThreadStaticAttribute инициализируется встроенным или явным образом в static конструкторе (Shared в Visual Basic). |
| CA2020: предотвращение изменения поведения, вызванного встроенными операторами IntPtr/UIntPtr | Некоторые встроенные операторы, добавленные в .NET 7, ведут себя не так, как определяемые пользователем операторы в .NET 6 и более ранних версиях. Некоторые операторы, которые раньше вызывали исключение в непроверяемом контексте при переполнении, больше не вызывают исключение, если только они не заключены в контекст checked. Некоторые операторы, которые ранее не генерировали исключение в контексте checked, теперь генерируют его, если только не помещены в контекст unchecked. |
| CA2021: не вызывайте Enumerable.Cast<T или Enumerable.OfType>T<> с несовместимыми типами | Вызов Enumerable.Cast<TResult>(IEnumerable) или Enumerable.OfType<TResult>(IEnumerable) задает параметр типа, несовместимый с типом входной коллекции. |
| CA2022: Избегать неточного чтения с помощью Stream.Read | Вызов Stream.Read может вернуть меньше байтов, чем запрошено, что приведет к ненадежной работе кода, если не проверять возвращаемое значение. |
| CA2023: недопустимые фигурные скобки в шаблоне сообщения | Фигурные скобки, имеющиеся в шаблоне сообщения, недопустимы. Убедитесь, что все фигурные скобки в шаблоне сообщения являются допустимыми открывающими и закрывающими скобками или экранированы. |
| CA2024: не используйте StreamReader.EndOfStream в асинхронных методах | Свойство StreamReader.EndOfStream может вызвать непреднамеренные синхронные блокировки, если данные не буферизованы. Вместо этого используйте StreamReader.ReadLineAsync() напрямую, который возвращает null при достижении конца потока. |
CA2025: не передавайте IDisposable экземпляры в незавершенные задачи |
Неожидаемые задачи, использующие IDisposable экземпляры, могут использовать эти экземпляры ещё долго после их удаления. Убедитесь, что задачи, использующие эти экземпляры, завершаются до удаления экземпляров. |
| CA2026: предпочитать JsonElement.Parse по сравнению с JsonDocument.Parse(). RootElement | Более эффективно JsonElement.Parse вызывать напрямую, чем вызывать JsonDocument.Parse().RootElement. |
| CA2100: проверьте SQL-запросы с целью выявления уязвимостей безопасности | Метод задает свойство System.Data.IDbCommand.CommandText с использованием строки, созданной из строкового аргумента метода. Это правило предполагает, что строковый аргумент содержит введенные пользователем данные. Созданная из введенных пользователем данных командная строка SQL уязвима перед атаками путем внедрения кода SQL. |
| CA2101: укажите маршалинг для строковых аргументов P/Invoke | Член Platform Invoke разрешает вызовы частично доверенным вызывающим объектам, имеет строковый параметр и не выполняет явный маршалинг строки. Это может стать причиной потенциальной уязвимости безопасности. |
| CA2109: проверьте видимые обработчики событий | Обнаружен открытый или защищенный метод обработки событий. Методы обработки событий следует раскрывать только в тех случаях, когда это совершенно необходимо. |
| CA2119: Запечатывать методы, реализующие закрытые интерфейсы | Открытый для наследования общедоступный тип предоставляет переопределяемую реализацию метода внутреннего (Friend в Visual Basic) интерфейса. Для устранения нарушения данного правила следует исключить возможность переопределения метода за пределами сборки. |
| CA2153: Избегайте обработки исключений повреждённого состояния программы | Исключения поврежденного состояния (CSE) указывают на то, что в процессе имеется повреждение памяти. Если перехватывать их вместо того, чтобы позволить процессу завершиться сбоем, это может привести к уязвимостям в системе безопасности, если злоумышленнику удастся поместить эксплойт в поврежденную область памяти. |
| CA2200: следует повторно вызывать исключение для сохранения сведений о стеке | Исключение повторно выбрасывается, и это исключение явно указывается в операторе throw. Если исключение повторно выбрасывается путем указания этого исключения в операторе throw, список вызовов методов между исходным методом, вызвавшим это исключение, и текущим методом теряется. |
| CA2201: не вызывайте зарезервированные типы исключений | Из-за этого становится трудно обнаружить и отладить изначальную ошибку. |
| CA2207: инициализируйте статические поля типа значений встроенными средствами | Тип значения объявляет явный статический конструктор. Чтобы устранить нарушение данного правила, выполните инициализацию всех статических данных при их объявлении и удалите статический конструктор. |
| CA2208: Правильно создавайте экземпляры исключений для аргументов | Вызов выполняется в конструктор по умолчанию (без параметров) типа исключения, который является или является производным от ArgumentException, или неверный строковый аргумент передается параметризованному конструктору типа исключения, который является или является производным от ArgumentException. |
| CA2211: неконстантные поля должны быть скрыты | Статические поля, которые не являются ни константами, ни доступными только для чтения, не являются потокобезопасными. Доступ к подобным полям должен тщательно контролироваться, и для синхронизации доступа к такому объекту класса требуются дополнительные методы программирования. |
| CA2213: Освобождаемые поля должны освобождаться | Тип, реализующий System.IDisposable, объявляет поля, принадлежащие к типам, которые также реализуют IDisposable. Метод Dispose этого поля не вызывается методом Dispose типа, в котором оно объявлено. |
| CA2214: Не вызывайте переопределяемые методы в конструкторах | Когда конструктор вызывает виртуальный метод, конструктор экземпляра, из которого вызывается этот метод, может ещё не завершить выполнение. |
| CA2215: метод Dispose должен вызывать метод Dispose базового класса | Если тип наследуется от удаляемого типа, он должен вызвать метод Dispose базового типа из собственного метода Dispose. |
| CA2216: высвобождаемые типы должны объявлять метод завершения | Тип, который реализует System.IDisposable и имеет поля, предусматривающие использование неуправляемых ресурсов, не реализует метод завершения, как описано в Object.Finalize. |
| CA2217: Не следует помечать перечисления атрибутом FlagsAttribute | Перечисление, видимое извне, помечено с помощью атрибута FlagsAttribute и имеет одно или несколько значений, которые не являются степенями двойки или комбинацией других определенных значений в этом перечислении. |
| CA2218: переопределяйте GetHashCode при переопределении Equals | Общедоступный тип переопределяет System.Object.Equals, но не переопределяет System.Object.GetHashCode. |
| CA2219: не создавайте исключения в предложениях исключений | Если исключение создается в предложении finally или fault, новое исключение скрывает активное исключение. При возникновении исключения в предложении фильтра среда выполнения автоматически перехватывает исключение. Из-за этого становится трудно обнаружить и отладить изначальную ошибку. |
| CA2224: переопределяйте Equals при перегрузке оператора == | Открытый тип реализует оператор равенства, но не переопределяет System.Object.Equals. |
| CA2225: Перегрузки оператора имеют именованные альтернативы | Обнаружена перегрузка оператора, однако не найден ожидаемый именованный альтернативный метод. Именованный альтернативный член предоставляет те же функции, что и основной оператор, и его могут использовать разработчики, которые программируют на языках, не поддерживающих перегрузку операторов. |
| CA2226: перегрузки операторов должны быть симметричны | Тип реализует оператор равенства или неравенства, но не реализует противоположный оператор. |
| CA2227: свойства коллекции должны иметь параметр "только для чтения" | Свойство коллекции, допускающее запись, позволяет пользователю заменять одну коллекцию другой. Свойство только для чтения предотвращает замену коллекции, но по-прежнему позволяет задавать отдельные её элементы. |
| CA2229: применяйте конструкторы сериализации | Чтобы устранить нарушение этого правила, реализуйте конструктор сериализации. Для закрытого класса сделайте конструктор закрытым; в противном случае сделайте его защищённым. |
| CA2231: Перегрузка оператора равенства при переопределении ValueType.Equals | Тип значения переопределяет Object.Equals, но не реализует оператор равенства. |
| CA2234: передавайте объекты System.Uri вместо строк | Вызывается метод, у которого есть строковый параметр, имя которого содержит "uri", "URI", "urn", "URN", "url" или "URL". Объявляющий тип метода содержит соответствующую перегрузку метода, которая имеет параметр System.Uri. |
| CA2235: помечайте все несериализуемые поля | Экземпляр поля несериализуемого типа объявлен в сериализуемом типе. |
| CA2237: пометьте типы ISerializable атрибутом SerializableAttribute | Чтобы среда CLR распознавала тип как сериализуемый, он должен быть помечен атрибутом SerializableAttribute, даже если тип использует пользовательскую процедуру сериализации посредством реализации интерфейса ISerializable. |
| CA2241: предоставьте правильные аргументы методам форматирования | Аргумент формата, переданный методу System.String.Format, не содержит элемент форматирования, соответствующий каждому аргументу объекта, или наоборот. |
| CA2242: Правильно проверяйте на NaN | Это выражение проверяет значение на соответствие Single.Nan или Double.Nan. Используйте Single.IsNan(Single) или Double.IsNan(Double) для проверки значения. |
| CA2243: строковые литералы атрибутов должны правильно анализироваться | Не удается правильно выполнить синтаксический анализ параметра строкового литерала атрибута для URL-адреса, идентификатора GUID или версии. |
| CA2244: не повторяйте инициализации индексированного элемента | Инициализатор объектов имеет несколько инициализаторов индексированных элементов с одинаковым индексом константы. Все инициализаторы, кроме последнего, являются избыточными. |
| CA2245: не присваивайте свойству себе | Свойство было случайно назначено самому себе. |
| CA2246: Не присваивайте значение символу и его члену в одном и том же операторе | Не рекомендуется назначать символ и его член, то есть поле или свойство в одном операторе. Неясно, предназначался ли доступ к члену для использования старого значения символа до назначения или нового значения из назначения в этом операторе. |
| CA2247: Аргумент, переданный в конструктор TaskCompletionSource, должен иметь тип перечисления TaskCreationOptions, а не TaskContinuationOptions. | TaskCompletionSource имеет конструкторы, принимающие TaskCreationOptions, которые управляют базовой задачей, и конструкторы, которые принимают состояние объекта, сохраненное в задаче. Если по ошибке передать TaskContinuationOptions вместо TaskCreationOptions, вызов интерпретирует эти параметры как объект состояния. |
| CA2248: укажите корректный аргумент перечисления для Enum.HasFlag | Тип перечисления, переданный в качестве аргумента при вызове метода HasFlag, отличается от типа перечисления, для которого вызывается этот метод. |
| CA2249: рекомендуется использовать String.Contains вместо String.IndexOf | Вызовы string.IndexOf, где результат используется для проверки наличия или отсутствия подстроки, можно заменить на string.Contains. |
CA2250: Использовать ThrowIfCancellationRequested |
ThrowIfCancellationRequested автоматически проверяет, был ли токен отменён, и, если это так, вызывает исключение OperationCanceledException. |
CA2251: использование String.Equals вместо String.Compare |
Использование String.Equals, скорее всего, будет более понятным и быстрым, чем сравнение результата String.Compare с нулем. |
| CA2252: согласие на использование предварительной версии функций | Включите предварительные возможности, прежде чем использовать API предварительной версии. |
| CA2253: именованные заполнители не должны быть числовыми значениями | Именованные заполнители в шаблоне сообщения ведения журнала не должны состоять только из числовых символов. |
| CA2254: шаблон должен быть статическим выражением | Шаблон сообщения журнала не должен меняться между вызовами. |
CA2255. Атрибут ModuleInitializer не должен использоваться в библиотеках |
Инициализаторы модулей предназначены для использования кодом приложения, чтобы компоненты приложения были инициализированы до того, как начнется выполнение кода приложения. |
| CA2256: Все члены, объявленные в родительских интерфейсах, должны иметь реализацию в интерфейсе, помеченном атрибутом DynamicInterfaceCastableImplementation | Типы, помеченные атрибутом DynamicInterfaceCastableImplementationAttribute, выступают в качестве реализации интерфейса для типа, реализующего тип IDynamicInterfaceCastable. В результате он должен реализовать все элементы, определённые в унаследованных интерфейсах, поскольку тип, реализующий IDynamicInterfaceCastable, иначе не будет их реализовывать. |
CA2257: элементы, определенные в интерфейсе с DynamicInterfaceCastableImplementationAttribute, должны быть static |
Так как тип, реализующий IDynamicInterfaceCastable , может не реализовать динамический интерфейс в метаданных, вызовы члена интерфейса экземпляра, который не является явной реализацией, определенной для этого типа, скорее всего, завершаются ошибкой во время выполнения. Пометьте новые члены static интерфейса, чтобы избежать ошибок среды выполнения. |
CA2258: предоставление DynamicInterfaceCastableImplementation интерфейса в Visual Basic не поддерживается |
Чтобы интерфейс, помеченный атрибутом DynamicInterfaceCastableImplementationAttribute, был функциональным, требуется возможность «Члены интерфейса по умолчанию», которая не поддерживается в Visual Basic. |
CA2259: Убедитесь, что ThreadStatic используется только со статическими полями |
ThreadStaticAttribute влияет только на static поля (Shared в Visual Basic). При применении к полям экземпляра атрибут не влияет на поведение. |
| CA2260: правильно реализуйте универсальные математические интерфейсы | Обобщённые математические интерфейсы требуют использования самого производного типа в качестве саморекурсивного параметра типа. |
CA2261: не используйте ConfigureAwaitOptions.SuppressThrowing вместе с Task<TResult> |
Параметр ConfigureAwaitOptions.SuppressThrowing не поддерживается универсальным Task<TResult>, так как это может привести к возврату недопустимого TResult. |
CA2262: задать MaxResponseHeadersLength правильно |
Убедитесь, что значение MaxResponseHeadersLength введено правильно. Это значение измеряется в килобайтах. |
| CA2263: Предпочитать универсальную перегрузку, если тип известен | Использовать обобщённую перегрузку предпочтительнее, чем передавать аргумент System.Type, когда тип известен, поскольку это позволяет писать более чистый и типобезопасный код и улучшает проверки на этапе компиляции. |
CA2264: не передайте ненулевое значение в ArgumentNullException.ThrowIfNull |
ArgumentNullException.ThrowIfNull вызывает ошибку, когда переданный аргумент — null. Некоторые конструкции, такие как структуры, не допускающие значения NULL, и nameof()new выражения, как известно, никогда не будут иметь значение NULL, поэтому ArgumentNullException.ThrowIfNull никогда не будет вызываться. |
CA2265: не сравнивайте Span<T> с null или default |
Сравнение диапазона с null или default может не делать то, что вы намеревались.
default и литерал null неявно преобразуются в Span<T>.Empty. |
CA2266: файловая точка входа программы должна начинаться с #! |
Если программа состоит из нескольких файлов, файл с точкой входа должен начинаться со строки shebang (#!), чтобы его можно было чётко отличить от других подключаемых файлов. |
| CA2300: не используйте небезопасный десериализатор BinaryFormatter | Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. |
| CA2301: Не вызывайте BinaryFormatter.Deserialize без предварительной установки BinaryFormatter.Binder | Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. |
| CA2302: убедитесь, что BinaryFormatter.Binder задан перед вызовом BinaryFormatter.Deserialize | Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. |
| CA2305: не используйте небезопасный десериализатор LosFormatter | Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. |
| CA2310: не используйте небезопасный десериализатор NetDataContractSerializer | Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. |
| CA2311: Не выполняйте десериализацию, не задав предварительно NetDataContractSerializer.Binder | Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. |
| CA2312: Убедитесь, что NetDataContractSerializer.Binder задан перед десериализацией | Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. |
| CA2315: не используйте небезопасный десериализатор ObjectStateFormatter | Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. |
| CA2321: Не выполняйте десериализацию с помощью JavaScriptSerializer с использованием SimpleTypeResolver | Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. |
| CA2322: убедитесь, что JavaScriptSerializer не инициализирован с помощью SimpleTypeResolver перед десериализацией | Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. |
| CA2326: не используйте значения TypeNameHandling, отличные от None | Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. |
| CA2327: Не используйте небезопасные JsonSerializerSettings | Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. |
| CA2328: обеспечение безопасности JsonSerializerSettings | Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. |
| CA2329: Не выполнять десериализацию с помощью JsonSerializer с небезопасной конфигурацией | Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. |
| CA2330: убедитесь, что JsonSerializer имеет безопасную конфигурацию при десериализации | Небезопасные десериализаторы уязвимы при десериализации ненадежных данных. Злоумышленник может изменить сериализованные данные и включить в них непредвиденные типы для внедрения объектов с вредоносными побочными эффектами. |
| CA2350: Убедитесь, что входные данные для DataTable.ReadXml() поступают из доверенного источника | При десериализации DataTable с недоверенными входными данными злоумышленник может создавать вредоносные входные данные для проведения атаки типа "отказ в обслуживании". Могут возникнуть неизвестные уязвимости удаленного выполнения кода. |
| CA2351: Убедитесь, что входные данные для DataSet.ReadXml() поступают из доверенного источника | При десериализации DataSet с недоверенными входными данными злоумышленник может создавать вредоносные входные данные для проведения атаки типа "отказ в обслуживании". Могут возникнуть неизвестные уязвимости удаленного выполнения кода. |
| CA2352: небезопасный набор данных или DataTable в сериализуемом типе может быть уязвим для атак удаленного выполнения кода | Класс или структура с пометкой SerializableAttribute содержит поле или свойство DataSet или DataTable и не имеет GeneratedCodeAttribute. |
| CA2353: небезопасный набор данных или DataTable в сериализуемом типе | Класс или структура, помеченная атрибутом сериализации XML или атрибутом контракта данных, содержит поле или свойство DataSet или DataTable. |
| CA2354: небезопасный набор данных или DataTable в графе десериализированных объектов может быть уязвим для удаленной атаки на выполнение кода | Десериализация с использованием сериализованного System.Runtime.Serialization.IFormatter, при которой граф объектов типа, к которому выполняется приведение, может включать DataSet или DataTable. |
| CA2355: небезопасный набор данных или DataTable в графе десериализированных объектов | Десериализация, когда граф объектов приведенного или указанного типа может включать DataSet или DataTable. |
| CA2356: ненадежные данные DataSet или DataTable в графе десериализованных веб-объектов | Метод с System.Web.Services.WebMethodAttribute или System.ServiceModel.OperationContractAttribute имеет параметр, который может ссылаться на DataSet или DataTable. |
| CA2361: убедитесь, что автогенерированный класс, содержащий DataSet.ReadXml() не используется с ненадежными данными. | При десериализации DataSet с недоверенными входными данными злоумышленник может создавать вредоносные входные данные для проведения атаки типа "отказ в обслуживании". Могут возникнуть неизвестные уязвимости удаленного выполнения кода. |
| CA2362: Небезопасные DataSet или DataTable в автоматически создаваемом сериализуемом типе могут быть уязвимы к атакам удалённого выполнения кода | При десериализации недоверенных входных данных с использованием BinaryFormatter, если десериализованный граф объектов содержит DataSet или DataTable, злоумышленник может сформировать вредоносную полезную нагрузку для выполнения атаки удаленного выполнения кода. |
| CA3001: Проверьте код на наличие уязвимостей, связанных с SQL-инъекциями | При работе с ненадежными входными данными и командами SQL следует учитывать вероятность атак путем внедрения кода SQL. Атака путем внедрения кода SQL позволяет выполнять вредоносные команды SQL, нарушая безопасность и целостность приложения. |
| CA3002: проверка кода уязвимостей XSS | При работе с ненадежными входными данными из веб-запросов следует учитывать возможность атак с использованием межсайтовых сценариев (XSS). При атаке XSS ненадежные входные данные внедряются в необработанные выходные данные HTML-ответа, что позволяет злоумышленнику выполнять вредоносные сценарии или умышленно изменять содержимое на веб-странице. |
| CA3003: Проверьте код на наличие уязвимостей внедрения пути к файлу | При работе с ненадежными входными данными из веб-запросов важно с осторожностью использовать вводимые пользователем данные при указании путей к файлам. |
| CA3004: проверка кода уязвимостей раскрытия информации | Раскрытие сведений об исключениях дает злоумышленникам сведения о внутренних компонентах приложения, что может помочь им найти другие уязвимости для эксплойта. |
| CA3005: проверка кода уязвимостей внедрения LDAP | При работе с недоверенными входными данными помните об атаках типа LDAP-инъекции. Такая атака может позволить злоумышленнику выполнять вредоносные инструкции LDAP в информационных каталогах. Особенно уязвимы приложения, в которых динамические инструкции LDAP для доступа к службам каталогов создаются на основе данных, введенных пользователем. |
| CA3006: Проверьте код на наличие уязвимостей, связанных с инъекцией команд процесса | Используя ненадежные входные данные, учитывайте вероятность атак путем внедрения команд. Атака путем внедрения команды может выполнять вредоносные команды в базовой операционной системе, нарушая безопасность и целостность сервера. |
| CA3007: Проверьте код на наличие уязвимостей открытого перенаправления | При работе с ненадежными входными данными не забывайте об уязвимостях открытых перенаправлений. Злоумышленник может использовать уязвимость открытого перенаправления, чтобы использовать ваш веб-сайт для создания видимости законного URL-адреса, но при этом перенаправить ничего не подозревающего посетителя на фишинговую или иную вредоносную веб-страницу. |
| CA3008: Проверка кода на наличие уязвимостей внедрения XPath | При работе с ненадежными входными данными следует учитывать вероятность атак путем внедрения кода XPath. Создание запросов XPath с помощью ненадежных входных данных может позволить злоумышленнику злонамеренно управлять запросом, чтобы вернуть непреднамеренный результат, и, возможно, раскрыть содержимое запрашиваемого XML. |
| CA3009: Проверьте код на наличие уязвимостей, связанных с внедрением XML | При работе с ненадежными входными данными следует учитывать вероятность атак путем внедрения кода XML. |
| CA3010: Проверьте код на наличие уязвимостей внедрения XAML | Используя ненадежные входные данные, учитывайте вероятность атак путем внедрения кода XML. XAML — это язык разметки, непосредственно представляющий создание и выполнение объекта. Это означает, что элементы, созданные в XAML, могут взаимодействовать с системными ресурсами (например, сетевым доступом и операциями ввода-вывода файловой системы). |
| CA3011: Проверьте код на наличие уязвимостей внедрения DLL | При работе с ненадежными входными данными следует учитывать возможность загрузки недоверенного кода. Если веб-приложение загружает ненадежный код, злоумышленник может внедрить вредоносные библиотеки DLL в процесс и выполнить вредоносный код. |
| CA3012: проверка кода для уязвимостей внедрения regex | При работе с ненадежными входными данными следует учитывать вероятность атак путем внедрения кода в регулярные выражения. Злоумышленник может использовать инъекцию в регулярное выражение, чтобы злонамеренно изменить его и заставить регулярное выражение сопоставлять непредусмотренные результаты или потреблять чрезмерные ресурсы ЦП, что приводит к атаке типа «отказ в обслуживании». |
| CA3061: Не добавляйте схему по URL-адресу | Не используйте небезопасную перегрузку метода Add, так как это может вызвать опасные внешние ссылки. |
| CA3075: обработка небезопасных DTD | Если вы используете небезопасные экземпляры DTDProcessing или ссылаетесь на внешние источники сущностей, средство синтаксического анализа может принимать ненадежные входные данные и раскрывать конфиденциальную информацию злоумышленникам. |
| CA3076: выполнение небезопасного скрипта XSLT | Если вы небезопасно выполняете преобразования XSLT (Extensible Stylesheet Language Transformations) в приложениях .NET, обработчик может обрабатывать обращения к недоверенным URI, что может раскрыть конфиденциальную информацию злоумышленникам и привести к атакам типа «отказ в обслуживании» (DoS) и межсайтовым атакам. |
| CA3077: небезопасная обработка при проектировании API, XML Document и XML Text Reader | При разработке API, производных от XMLDocument и XMLTextReader, обратите внимание на DtdProcessing. Использование небезопасных экземпляров DTDProcessing при ссылке или разрешении внешних источников сущностей или настройке небезопасных значений в XML может привести к раскрытию информации. |
| CA3147: помечайте обработчики HTTP-глаголов атрибутом ValidateAntiForgeryToken | При разработке контроллера ASP.NET MVC следует учитывать атаки межсайтовой подделки запросов (CSRF). Атака с использованием подделки межсайтовых запросов позволяет отправлять вредоносные запросы от пользователя, прошедшего проверку подлинности, в контроллер MVC ASP.NET. |
| CA5350: не используйте ненадежные алгоритмы шифрования | Ненадежные алгоритмы шифрования и функции хэширования еще используются сегодня по ряду причин, но они не должны использоваться для обеспечения конфиденциальности или целостности данных, которые они защищают. Это правило срабатывает при обнаружении в коде алгоритмов TripleDES, SHA1 или RIPEMD160. |
| CA5351: не используйте ослабленные алгоритмы шифрования | Ослабленные алгоритмы шифрования не считаются безопасными, и их использование настоятельно не рекомендуется. Это правило срабатывает при обнаружении в коде хэш-алгоритма MD5 или алгоритмов шифрования RC2 или DES. |
| CA5358: не используйте небезопасные режимы шифров | Не используйте небезопасные режимы шифрования |
| CA5359: не отключайте проверку сертификата | Сертификат может помочь подтвердить подлинность сервера. Клиенты должны проверить сертификат сервера, чтобы обеспечить отправку запросов на нужный сервер. Если ServerCertificateValidationCallback всегда возвращает значение true, любой сертификат будет проходить проверку. |
| CA5360: Не вызывайте опасные методы при десериализации | Небезопасная десериализация — это уязвимость, которая возникает, когда недоверенные данные используются для нарушения логики приложения, проведения атаки типа "отказ в обслуживании" или даже для выполнения произвольного кода после десериализации. Злоумышленники часто могут злоупотреблять этими функциями десериализации, когда приложение десериализует недоверенные данные, которые находятся под контролем злоумышленников. В частности, они могут вызывать опасные методы в процессе десериализации. Успешные атаки с использованием небезопасной десериализации могут позволить злоумышленнику осуществлять такие атаки, как DoS-атаки, обход проверки подлинности и удаленное выполнение кода. |
| CA5361: не отключайте использование строгой криптографии в Schannel | Установка Switch.System.Net.DontEnableSchUseStrongCrypto в true ослабляет шифрование, используемое в исходящих подключениях по протоколу TLS. Более слабое шифрование может нарушить конфиденциальность взаимодействия между приложением и сервером, что облегчит злоумышленникам перехват конфиденциальных данных. |
| CA5362: потенциальный цикл ссылок в графе десериализированных объектов | При десериализации недоверенных данных любой код, обрабатывающий десериализованный граф объекта, должен обрабатывать циклы ссылок без перехода в бесконечные циклы. Сюда входит код, который является частью обратного вызова десериализации, и код, обрабатывающий граф объекта после завершения десериализации. В противном случае злоумышленник может выполнить атаку типа "отказ в обслуживании" с вредоносными данными, содержащими цикл ссылок. |
| CA5363: не отключайте проверку запроса | Проверка запросов — это функция в ASP.NET, которая проверяет HTTP-запросы и определяет, включают ли они потенциально опасное содержимое, которое может привести к атакам путем внедрения кода, включая подделку межсайтовых запросов. |
| CA5364: не используйте устаревшие протоколы безопасности | Безопасность транспортного уровня (TLS) защищает обмен данными между компьютерами, чаще всего — в протоколе HTTPS. Более ранние версии протокола TLS менее безопасны, чем TLS 1.2 и TLS 1.3, и, скорее всего, будут подвержены новым уязвимостям. Избегайте использования более ранних версий протокола, чтобы снизить риск. |
| CA5365: не отключайте проверку заголовка HTTP | Проверка HTTP-заголовка позволяет кодировать символы возврата каретки \r и новой строки \n, которые находятся в заголовках ответа. Эта кодировка помогает избежать атак путем внедрения, эксплуатирующих приложение, которое выводит на экран недоверенные данные, содержащиеся в заголовке. |
| CA5366: использование XmlReader для чтения XML набора данных | Использование DataSet для чтения XML с ненадежными данными может привести к загрузке опасных внешних ссылок, поэтому доступ к ним следует ограничить, используя XmlReader с безопасным обработчиком разрешения ссылок или с отключенной обработкой DTD. |
| CA5367: не сериализуйте типы с полями указателя | Это правило проверяет, существует ли сериализуемый класс с полем указателя или свойством. Элементы, которые не могут быть сериализованы, могут быть указателями, такими как статические члены или поля, помеченные атрибутом NonSerializedAttribute. |
| CA5368: настройка ViewStateUserKey для классов, производных от страницы | Установка свойства ViewStateUserKey поможет предотвратить атаки на приложение, позволяя назначить идентификатор переменной состояния представления для отдельных пользователей, чтобы злоумышленники не могли использовать эту переменную для создания атаки. В противном случае будут обнаружены уязвимости для подделки межсайтовых запросов. |
| CA5369: использование XmlReader для десериализации | Обработка ненадёжных DTD и XML-схем может сделать возможной загрузку опасных внешних ссылок, доступ к которым следует ограничить, используя XmlReader с безопасным средством разрешения ссылок или с отключенной обработкой DTD и встроенных XML-схем. |
| CA5370: используйте XmlReader для проверки средства чтения | Обработка ненадежных схем DTD и XML может включать загрузку опасных внешних ссылок. Эту опасную загрузку можно ограничить, используя XmlReader с защищенным распознавателем или с отключенной обработкой встроенных схем DTD и XML. |
| CA5371: использование XmlReader для чтения схемы | Обработка ненадежных схем DTD и XML может включать загрузку опасных внешних ссылок. Использование XmlReader с защищенным распознавателем или с отключенной обработкой встроенных схем DTD и XML позволяет ограничить эту возможность. |
| CA5372: использование XmlReader для XPathDocument | Обработка XML из ненадёжного источника может приводить к загрузке опасных внешних ресурсов; их загрузку можно ограничить, используя XmlReader с безопасным XmlResolver или отключив обработку DTD. |
| CA5373: не используйте устаревшую функцию вывода ключей | Это правило обнаруживает вызов методов наследования слабых ключей System.Security.Cryptography.PasswordDeriveBytes и Rfc2898DeriveBytes.CryptDeriveKey. Метод System.Security.Cryptography.PasswordDeriveBytes использовал слабый алгоритм PBKDF1. |
| CA5374: не используйте XslTransform | Это правило проверяет, создаётся ли в коде экземпляр System.Xml.Xsl.XslTransform. System.Xml.Xsl.XslTransform теперь является устаревшим и не должен использоваться. |
| CA5375: не используйте подпись общего доступа учетной записи | SAS учетной записи может предоставлять делегированный доступ на выполнение операций чтения, записи и удаления для контейнеров BLOB-объектов, таблиц, очередей и общих файловых ресурсов, которые невозможно разрешить с помощью SAS службы. Однако он не поддерживает политики уровня контейнеров и обладает меньшей гибкостью и уровнем контроля предоставленных разрешений. Если злоумышленники его получат, они смогут с легкостью взломать вашу учетную запись хранения. |
| CA5376: Используйте SharedAccessProtocol HttpsOnly | SAS — это конфиденциальные данные, которые нельзя передавать в виде обычного текста по протоколу HTTP. |
| CA5377: использование политики доступа на уровне контейнера | Политику доступа на уровне контейнера можно изменить или отозвать в любое время. Она обеспечивает большую гибкость и контроль над предоставляемыми разрешениями. |
| CA5378: не отключайте ServicePointManagerSecurityProtocols | Установка Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols в значение true ограничивает TLS-подключения Windows Communication Framework (WCF) использованием только TLS 1.0. Эта версия TLS будет считаться нерекомендуемой. |
| CA5379: Не используйте слабый алгоритм функции формирования ключа | Класс Rfc2898DeriveBytes по умолчанию использует алгоритм SHA1. Вам нужно указать хэш-алгоритм для использования в некоторых перегрузках конструктора с помощью SHA256 или выше. Обратите внимание, что свойство HashAlgorithm имеет только метод доступа get и не имеет модификатор overridden. |
| CA5380: не добавляйте сертификаты в корневое хранилище | Это правило обнаруживает код, добавляющий сертификат в хранилище «Доверенные корневые центры сертификации». По умолчанию хранилище сертификатов Доверенных корневых центров сертификации настроено с набором общедоступных центров сертификации, удовлетворяющих требованиям Программы корневых сертификатов Майкрософт. |
| CA5381: убедитесь, что сертификаты не добавляются в корневое хранилище | Это правило обнаруживает код, который может добавлять сертификат в хранилище сертификатов Доверенных корневых центров сертификации. По умолчанию хранилище сертификатов Доверенных корневых центров сертификации настроено с набором общедоступных центров сертификации, удовлетворяющих требованиям Программы корневых сертификатов Майкрософт. |
| CA5382: использование безопасных файлов cookie в ASP.NET Core | Приложения, доступные по протоколу HTTPS, должны использовать защищенные файлы cookie, что указывает браузеру на то, что эти файлы следует передавать только по протоколу SSL. |
| CA5383. Обеспечение безопасности файлов cookie в ASP.NET Core | Приложения, доступные по протоколу HTTPS, должны использовать защищенные файлы cookie, что указывает браузеру на то, что эти файлы следует передавать только по протоколу SSL. |
| CA5384: не используйте алгоритм цифровой подписи (DSA) | DSA — это слабый алгоритм асимметричного шифрования. |
| CA5385: использование алгоритма Rivest-Shamir-Adleman (RSA) с достаточным размером ключа | Ключ RSA длиной менее 2048 бит более уязвим для атак грубой силы. |
| CA5386: избегайте жесткого кодирования значения SecurityProtocolType | Безопасность транспортного уровня (TLS) защищает обмен данными между компьютерами, чаще всего — в протоколе HTTPS. Протоколы версии TLS 1.0 и TLS 1.1 являются устаревшими, а TLS 1.2 и TLS 1.3 являются актуальными. В будущем протокол TLS 1.2 и TLS 1.3 могут быть устаревшими. Чтобы обеспечить безопасность приложения, не следует жестко задавать версию протокола, и рекомендуется использовать по крайней мере .NET Framework версии 4.7.1. |
| CA5387: не используйте функцию слабого вывода ключей с недостаточным числом итерации | Это правило проверяет, был ли криптографический ключ создан классом Rfc2898DeriveBytes с числом итераций менее 100 000. Большее число итераций может помочь защититься от словарных атак, направленных на подбор сгенерированного криптографического ключа. |
| CA5388: убедитесь, что при использовании слабой функции деривации ключа задано достаточное число итераций | Это правило проверяет, был ли криптографический ключ создан Rfc2898DeriveBytes с числом итерации, которое может быть меньше 100 000. Большее число итераций может помочь защититься от словарных атак, направленных на подбор сгенерированного криптографического ключа. |
| CA5389: не добавляйте путь к элементу архива в путь целевой файловой системы | Путь к файлу может быть относительным и привести к доступу к файловой системе за пределами ожидаемого целевого пути, повышая риск вредоносного изменения конфигурации и удаленного выполнения кода с помощью метода выжидания. |
| CA5390: Не следует жестко задавать ключ шифрования в коде | Для успешного выполнения симметричного алгоритма секретный ключ должен быть известен только отправителю и получателю. Если ключ жестко задан, его легко обнаружить. Даже если используются скомпилированные двоичные файлы, злоумышленники могут легко его извлечь. После компрометации закрытого ключа текст шифра может быть расшифрован напрямую и больше не является защищенным. |
| CA5391: использование маркеров защиты от подделки в контроллерах MVC ASP.NET Core | Обработка запроса POST, PUT, PATCH или DELETE без проверки маркера защиты от подделки запросов может быть уязвима к атакам межсайтовой подделки запросов. Атака с использованием подделки межсайтовых запросов позволяет отправлять вредоносные запросы от пользователя, прошедшего проверку подлинности, в контроллер MVC ASP.NET Core. |
| CA5392: использование атрибута DefaultDllImportSearchPaths для P/Invokes | По умолчанию функции P/Invoke, использующие DllImportAttribute, выполняют поиск в нескольких каталогах, включая текущий рабочий каталог, при поиске загружаемой библиотеки. Это может быть проблемой безопасности для некоторых приложений, приводящей к перехвату библиотеки DLL. |
| CA5393: не используйте небезопасное значение DllImportSearchPath | В каталогах поиска DLL по умолчанию и каталогах сборок может находиться вредоносная библиотека DLL. Или в зависимости от того, откуда запускается приложение, в каталоге приложения может быть вредоносная библиотека DLL. |
| CA5394: не используйте небезопасную случайность | Использование криптографически слабого генератора псевдослучайных чисел может позволить злоумышленнику предсказать, какое критичное для безопасности значение будет сгенерировано. |
| CA5395: Отсутствует атрибут HttpVerb для методов действий | Все методы действий, которые создают, изменяют, удаляют или иным образом модифицируют данные, должны быть защищены с помощью атрибута защиты от подделки межсайтовых запросов. Операция GET должна выполняться безопасным способом, то есть не иметь побочных эффектов и не изменять существующие данные. |
| CA5396: задайте для HttpOnly значение true для HttpCookie | Для обеспечения глубокого уровня защиты HTTP-файлы cookie, чувствительные к безопасности, должны быть помечены как HttpOnly. Это означает, что веб-браузеры должны запрещать скриптам доступ к файлам cookie. Внедренные скрипты являются распространенным способом кражи файлов cookie. |
| CA5397: не используйте устаревшие значения SslProtocols | Безопасность транспортного уровня (TLS) защищает обмен данными между компьютерами, чаще всего — в протоколе HTTPS. Более ранние версии протокола TLS менее безопасны, чем TLS 1.2 и TLS 1.3, и, скорее всего, будут подвержены новым уязвимостям. Избегайте использования более ранних версий протокола, чтобы снизить риск. |
| CA5398: избегайте жестко закодированных значений SslProtocols | Безопасность транспортного уровня (TLS) защищает обмен данными между компьютерами, чаще всего — в протоколе HTTPS. Протоколы версии TLS 1.0 и TLS 1.1 являются устаревшими, а TLS 1.2 и TLS 1.3 являются актуальными. В будущем протокол TLS 1.2 и TLS 1.3 могут быть устаревшими. Чтобы обеспечить безопасность приложения, не следует жестко задавать версию протокола. |
| CA5399: определенно отключите проверку списка отзыва сертификатов HttpClient | Отозванный сертификат больше не является доверенным. Злоумышленники могут использовать его для передачи вредоносных данных или кражи конфиденциальных данных при взаимодействии по протоколу HTTPS. |
| CA5400: убедитесь, что проверка списка отзыва сертификатов HttpClient не отключена | Отозванный сертификат больше не является доверенным. Злоумышленники могут использовать его для передачи вредоносных данных или кражи конфиденциальных данных при взаимодействии по протоколу HTTPS. |
| CA5401: не используйте CreateEncryptor с вектором инициализации (IV), не являющимся значением по умолчанию | При симметричном шифровании всегда следует использовать неповторяющийся вектор инициализации, чтобы предотвратить атаки по словарю. |
| CA5402: используйте CreateEncryptor со значением по умолчанию IV | При симметричном шифровании всегда следует использовать неповторяющийся вектор инициализации, чтобы предотвратить атаки по словарю. |
| CA5403: Не задавайте сертификат жестко в коде | Параметр data или rawData конструктора X509Certificate или X509Certificate2 жестко задан. |
| CA5404: не отключать проверки токена | Свойства TokenValidationParameters, управляющие проверкой токена, не должны иметь значение false. |
| CA5405: не следует всегда пропускать проверку токена в делегатах | Функция обратного вызова, назначенная AudienceValidator или LifetimeValidator, всегда возвращает true. |
| IL3000: не используйте путь к файлу сборки при публикации в виде одного файла. | Не используйте путь к файлу сборки при публикации в виде одного файла. |
| IL3001: избегайте доступа к пути к файлу сборки при публикации в виде одного файла | Не используйте путь к файлу сборки при публикации в виде одного файла. |
IL3002: избегайте вызова членов, аннотированных RequiresAssemblyFilesAttribute, при публикации в формате одного файла |
Избегайте вызова членов, аннотированных RequiresAssemblyFilesAttribute, при публикации в упакованный единый файл. |
IL3003: RequiresAssemblyFilesAttribute аннотации должны соответствовать всем реализациям интерфейса и переопределениям. |
RequiresAssemblyFilesAttribute аннотации должны совпадать во всех реализациях интерфейса или переопределениях. |
IL3005: RequiresAssemblyFilesAttribute нельзя поместить непосредственно в точку входа приложения. |
RequiresAssemblyFilesAttribute нельзя поместить непосредственно в точку входа приложения. |
Legend
В следующей таблице показан тип сведений, предоставляемых для каждого правила в справочной документации.
| Item | Description |
|---|---|
| Type | Имя типа для правила. |
| Идентификатор правила | Уникальный идентификатор правила. Идентификатор и категория правила используются для подавления предупреждений в исходном коде. |
| Category | Категория правила, например безопасность. |
| Исправление является критическим или не критическим | Является ли исправление нарушения правила критическим изменением. Критическое изменение означает, что сборка с зависимостью от целевого объекта, вызвавшего нарушение, не будет перекомпилироваться с новой фиксированной версией или может завершиться ошибкой во время выполнения из-за изменения. Если доступно несколько исправлений и по крайней мере одно исправление является критическим изменением, а другое — нет, указываются оба варианта: «Breaking» и «Non-breaking». |
| Cause | Конкретный управляемый код, из-за которого правило выдает предупреждение. |
| Description | Описывает проблемы, вызвавшие предупреждение. |
| Устранение нарушений | Описывает, как изменить исходный код, чтобы соблюсти правило и предотвратить создание предупреждений. |
| Когда лучше отключить предупреждения | Описывает, когда можно безопасно подавить предупреждение, выдаваемое правилом. |
| Пример кода | Примеры, которые нарушают правила, и исправленные примеры, соблюдающие правило. |
| Связанные правила | Связанные правила. |