Правила качества кода
Анализ кода .NET предусматривает правила, предназначенные для улучшения качества кода. Они разбиты по таким категориям, как разработка, глобализация, производительность и безопасность. Некоторые правила относятся к использованию API .NET, другие — к общему качеству кода.
Индекс правил
В следующей таблице перечислены правила анализа качества кода.
Идентификаторы правил и предупреждения | Description |
---|---|
CA1000: не объявляйте статические элементы в универсальных типах | При вызове статического элемента универсального типа нужно указать аргумент этого типа. При вызове универсального экземпляра элемента, не поддерживающего вывод типа, для элемента нужно указать аргумент типа. В этих двух случаях синтаксис для определения аргумента типа различен, и его можно легко спутать. |
CA1001: типы, которым принадлежат освобождаемые поля, должны быть освобождаемыми | В классе объявляется и реализуется поле экземпляра, которое принадлежит типу System.IDisposable, однако класс не реализует интерфейс IDisposable. Класс, в котором объявляется поле IDisposable, неявно владеет неуправляемым ресурсом и должен реализовывать интерфейс IDisposable. |
CA1002: не следует раскрывать универсальные списки | System.Collections.Generic.List<(Of <(T>)>) — это универсальная коллекция, предназначенная для производительности, а не наследования. Поэтому виртуальные элементы в списке отсутствуют. Вместо этого для наследования следует предоставить универсальную коллекцию. |
CA1003: используйте экземпляры обработчика универсальных событий | Тип содержит делегат, возвращающий void, подпись которого содержит два параметра (первый объект и второй тип, который можно назначить EventArgs), а содержащая сборка предназначена для Microsoft платформа .NET Framework 2.0. |
CA1005: не используйте слишком много параметров в универсальных типах | Чем больше параметров типов содержит универсальный тип, тем сложнее знать и запоминать, что представляет каждый параметр типа. Обычно это очевидно с одним параметром типа, как в list<T>, и в некоторых случаях с двумя параметрами типа, как в словаре<TKey, TValue>. Если же используется более двух параметров типов, многие пользователи начинают испытывать большие трудности. |
CA1008: перечисляемые типы должны иметь нулевое значение | Значение по умолчанию неинициализированного перечисления, как и других типов значений, равно нулю. Перечисление без флагов в качестве атрибутов должно определять член с использованием нулевого значения так, чтобы значение по умолчанию было допустимым значением перечисления. Если перечисление с примененным атрибутом 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#) (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, но не реализует IEquatable<T>. |
CA1067: переопределение равно при реализации 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: использование вспомогательной функции argumentNullException | Вспомогательные средства проще и эффективнее, чем if блоки, создающие новый экземпляр исключений. |
CA1511: использование вспомогательной функции аргументаException | Вспомогательные средства проще и эффективнее, чем if блоки, создающие новый экземпляр исключений. |
CA1512: использование вспомогательной функции argumentOutOfRangeException | Вспомогательные средства проще и эффективнее, чем if блоки, создающие новый экземпляр исключений. |
CA1513: использование вспомогательной функции objectDisposedException | Вспомогательные средства проще и эффективнее, чем if блоки, создающие новый экземпляр исключений. |
CA1514: избегайте избыточного аргумента длины | Аргумент избыточной длины используется при срезе в конец строки или буфера. Вычисляемая длина может быть подвержена ошибкам и также не требуется. |
CA1515: рекомендуется сделать общедоступные типы внутренними | В отличие от библиотеки классов, API приложения обычно не ссылается публично, поэтому типы могут быть помечены внутренними. |
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 (Const в Visual Basic), чтобы значение вычислялось не во время выполнения, а во время компиляции. |
CA1805: не делайте лишних инициализаций | Среда выполнения .NET инициализирует все поля ссылочных типов со значениями по умолчанию перед выполнением конструктора. В большинстве случаев явно инициализация поля в значение по умолчанию является избыточным, что добавляет затраты на обслуживание и может снизить производительность (например, при увеличении размера сборки). |
CA1806: не игнорируйте результаты метода | Создается, но никогда не используется новый объект, либо вызывается метод, который создает и возвращает новую строку, и такая новая строка никогда не используется, либо метод COM или P/Invoke возвращает HRESULT или код ошибки, который никогда не используется. |
CA1810: инициализируйте статические поля ссылочного типа встроенными средствами | Если в типе объявляется явный статический конструктор, компилятор JIT добавляет проверку в каждый статический метод и конструктор экземпляров этого типа, чтобы убедиться, что статический конструктор уже вызывался ранее. Проверки статических конструкторов могут привести к снижению производительности. |
CA1812: не создавайте внутренние классы без экземпляров | Экземпляр типа уровня сборки не создается кодом в сборке. |
CA1813: избегайте распечатанных атрибутов | .NET предоставляет методы для извлечения настраиваемых атрибутов. По умолчанию эти методы осуществляют поиск иерархии наследования атрибутов. Если запечатать атрибут, поиск в иерархии наследования выполняться не будет, в результате чего может повыситься производительность. |
CA1814: используйте ступенчатые массивы вместо многомерных | Массив массивов — это массив, элементы которого сами являются массивами. Массивы, которые составляют элементы, могут иметь различные размеры, что позволяет экономить пространство для некоторых наборов данных. |
CA1815: следует переопределять равенства и равенства операторов в типах значений | В унаследованной реализации Equals для типов значений используется библиотека отражения и сравнивается содержимое всех полей. Отражение является процессом, требующим с точки зрения вычислений больших затрат, и сравнение каждого поля на равенство может быть лишним. Если предполагается, что пользователи будут сравнивать, сортировать экземпляры или использовать их в качестве ключей хэш-таблиц, тип значения должен реализовывать Equals. |
CA1816: вызов GC.SuppressFinalize должен осуществляться правильно | Метод, который является реализацией Dispose, не вызывает GC. SuppressFinalize; или метод, который не является реализацией GC вызовов Dispose. SuppressFinalize; или метод вызывает GC. Подавляйтеfinalize и передает что-то, отличное от этого (я в Visual Basic). |
CA1819: свойства не должны возвращать массивы | Массивы, возвращаемые свойствами, не защищены от записи, даже если свойство доступно только для чтения. Чтобы защитить массив от изменений, свойство должно возвращать копию массива. Как правило, пользователи не понимают требований к производительности при вызове такого свойства. |
CA1820: проверьте наличие пустых строк путем проверки длины строки | Сравнивать строки с использованием свойства String.Length или метода String.IsNullOrEmpty значительно быстрее, чем с помощью Equals. |
CA1821: удаляйте пустые методы завершения | Если возможно, старайтесь не использовать финализаторы, поскольку из-за отслеживания жизненного срока объектов снижается производительность программы. Пустой метод завершения создает дополнительную нагрузку на систему, не обеспечивая никаких преимуществ. |
CA1822: помечайте члены как статические | Элементы, не обращающиеся к данным экземпляра и не вызывающие методы экземпляра, можно помечать как статические (общие в Visual Basic). Если пометить методы как статические, компилятор предоставит этим членам невиртуальные места вызова. Это обеспечивает значительное повышение производительности при работе с кодом, для которого важна высокая производительность системы. |
CA1823: избегайте наличия неиспользованных закрытых полей | Обнаружены закрытые поля, доступ к которым, судя по всему, не предоставляется в сборке. |
CA1824: следует помечать сборки атрибутом NeutralResourcesLanguageAttribute | Атрибут NeutralResourcesLanguage сообщает Resource Manager о языке, использованном для отображения в сборке ресурсов, не зависящих от языка или региональных параметров. При этом повышается эффективность поиска первого загружаемого ресурса и может сократиться рабочее множество. |
CA1825: избегайте выделения массива нулевой длины | Инициализация массива нулевой длины приводит к выделению лишней памяти. Вместо этого используйте статический выделенный экземпляр пустого массива, вызвав метод Array.Empty. Выделение памяти является общим для всех вызовов этого метода. |
CA1826: используйте свойство вместо метода Linq Enumerable | Метод LINQ Enumerable использовался для типа, поддерживающего эквивалентное и более эффективное свойство. |
CA1827: не используйте Count/LongCount, если можно использовать Любой. | Использовался метод Count или LongCount, тогда как более эффективным был бы метод Any. |
CA1828: не используйте CountAsync/LongCountAsync при использовании AnyAsync | Использовался метод CountAsync или LongCountAsync, тогда как более эффективным был бы метод AnyAsync. |
CA1829: используйте свойство Length/Count вместо метода Enumerable.Count | Метод LINQ Count использовался для типа, поддерживающего эквивалентное и более эффективное свойство Length или Count . |
CA1830: предпочитайте строго типизированные перегрузки методов Добавления и вставки в 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<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: используйте диапазон<T>. Clear() вместо Span<T>. Fill() | Более эффективно Span<T>.Clear() вызывать, чем вызывать Span<T>.Fill(T) элементы диапазона со значением по умолчанию. |
CA1856: неправильное использование атрибута ConstantExpected | Атрибут ConstantExpectedAttribute не применяется правильно к параметру. |
CA1857: параметр ожидает константы для оптимальной производительности | Недопустимый аргумент передается параметру, который заметен с ConstantExpectedAttributeпомощью . |
CA1858: используйте StartsWith вместо IndexOf | Более эффективно String.StartsWith вызывать, чем String.IndexOf вызывать, чтобы проверить, начинается ли строка с заданным префиксом. |
CA1859: используйте конкретные типы, если это возможно для повышения производительности | Код использует типы интерфейса или абстрактные типы, что приводит к ненужным вызовам интерфейса или виртуальным вызовам. |
CA1860: избегайте использования метода расширения "Enumerable.Any()" | Более эффективно и ясно использовать Length , Count или IsEmpty (если возможно), чем вызывать Enumerable.Any , чтобы определить, имеет ли тип коллекции какие-либо элементы. |
CA1861: избегайте массивов констант в качестве аргументов | Массивы констант, передаваемые в качестве аргументов, не используются повторно, что подразумевает затраты на производительность. Рекомендуется извлечь их в поля статического чтения, чтобы повысить производительность. |
CA1862: используйте перегрузки метода StringComparison для сравнения строк без учета регистра. | При вызове ToLower() кода или ToUpper() выполнении сравнения нечувствительных строк регистра выполняется ненужное выделение. |
CA1863: используйте составной формат | Чтобы уменьшить затраты на форматирование, кэшировать и использовать 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: не передайте структуру, допускаемую значение NULL, в "ArgumentNullException.ThrowIfNull" | "ArgumentNullException.ThrowIfNull" принимает объект, поэтому передача структуры, допускающего значение NULL, может привести к тому, что значение будет задано в поле. |
CA1872: предпочитайте "Convert.ToHexString" и "Convert.ToHexStringLower" по цепочкам вызовов на основе BitConverter.ToString. | Используйте Convert.ToHexString или Convert.ToHexStringLower когда кодирование байтов в шестнадцатеричное строковое представление. Эти методы более эффективны и удобны для выделения, чем используются BitConverter.ToString в сочетании с String.Replace заменой дефисов и String.ToLower. |
CA2000: удалите объекты до того, как будет потеряна область действия | Необходимо явно удалить объект до того, как все ссылки на него окажутся вне области действия, так как может произойти исключительное событие, которое воспрепятствует выполнению метода завершения объекта. |
CA2002: не блокировать объекты со слабой идентификацией | К объекту со слабой идентификацией может быть получен прямой доступ через границы домена приложения. Поток пытается получить блокировку объекта со слабой идентификацией, который может быть заблокирован вторым потоком в другом домене приложения, имеющим блокировку того же объекта. |
CA2007: не ожидайте непосредственно задачи | Асинхронный метод ожидает класс Task напрямую. Когда асинхронный метод ожидает Task напрямую, продолжение происходит в том же потоке, который создал задачу. Такое поведение может быть дорогостоящим в плане производительности и может привести к взаимоблокировке потока пользовательского интерфейса. Чтобы сообщить о намерении продолжения, рассмотрите возможность вызова метода Task.ConfigureAwait(Boolean). |
CA2008: не создавайте задачи без передачи TaskScheduler | Операция создания или продолжения задачи использует перегрузку метода, в которой не указан параметр TaskScheduler. |
CA2009: не вызывайте ToImmutableCollection в неизменяемом значенииCollection | Метод ToImmutable был без необходимости вызван для неизменяемой коллекции из пространства имен System.Collections.Immutable. |
CA2011: не назначайте свойство в своем наборе | Свойству было случайно присвоено значение в его методе доступа 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 и более ранних версиях. Некоторые операторы, которые использовались для вызова без флажка контекста во время переполнения, больше не вызываются, если не упакованы в проверенный контекст. Некоторые операторы, которые ранее не вызвали флажок в проверяемом контексте, теперь вызываются, если только не упакованы в неконтролируемый контекст. |
CA2021: не вызывайте Enumerable.Cast<T или Enumerable.OfType<T>> с несовместимыми типами | Вызов Enumerable.Cast<TResult>(IEnumerable) или Enumerable.OfType<TResult>(IEnumerable) задает параметр типа, несовместимый с типом входной коллекции. |
CA2022: избегайте неисключаемого чтения с помощью Stream.Read | Вызов Stream.Read может возвращать меньше байтов, чем запрошено, в результате чего ненадежный код, если возвращаемое значение не проверяется. |
CA2100: проверьте SQL-запросы с целью выявления уязвимостей безопасности | Метод задает свойство System.Data.IDbCommand.CommandText с использованием строки, созданной из строкового аргумента метода. Это правило предполагает, что строковый аргумент содержит введенные пользователем данные. Созданная из введенных пользователем данных командная строка SQL уязвима перед атаками путем внедрения кода SQL. |
CA2101: указание маршалинга для аргументов строки P/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. |
CA2216: высвобождаемые типы должны объявлять метод завершения | Тип, который реализует System.IDisposable и имеет поля, предусматривающие использование неуправляемых ресурсов, не реализует метод завершения, как описано в Object.Finalize. |
CA2217: не следует помечать перечисления атрибутом FlagsAttribute | Доступное для внешнего кода перечисление помечено атрибутом FlagsAttribute и имеет одно или несколько значений, которые не являются степенью двойки или сочетанием других определенных значений в перечислении. |
CA2218: переопределяйте GetHashCode при переопределении Equals | Открытый тип переопределяет System.Object.Equals, но не System.Object.GetHashCode. |
CA2219: не создавайте исключения в предложениях исключений | Если исключение создается в предложении finally или fault, новое исключение скрывает активное исключение. При возникновении исключения в предложении фильтра среда выполнения автоматически перехватывает исключение. Из-за этого становится трудно обнаружить и отладить изначальную ошибку. |
CA2224: переопределяйте равенство при перегрузке оператора равенства | Открытый тип реализует оператор равенства, но не переопределяет 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, должны быть статическими. | Так как тип, реализующий 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. | АргументNullException.ThrowIfNull вызывается, когда переданный аргумент имеет значение NULL. Некоторые конструкции, такие как структуры, не допускающие значение NULL, и "nameof()" и "new" выражения, как известно, никогда не имеют значения NULL, поэтому "ArgumentNullException.ThrowIfNull" никогда не будет вызываться. |
CA2265: не сравнивайте или null не сравнивайте Span<T> default |
Сравнение диапазона с null или default может не делать то, что вы намеревались. default null и литерал неявно преобразуются в Span<T>.Empty . |
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: небезопасный набор данных или 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) в приложениях .NET обработчик может разрешать ненадежные ссылки URI, которые могут раскрывать конфиденциальную информацию злоумышленникам, что приводит к атакам типа "отказ в обслуживании" и "Межсайтовые атаки". |
CA3077: небезопасная обработка в структуре API средств чтения документов и текста XML | При разработке API, производных от XMLDocument и XMLTextReader, обратите внимание на DtdProcessing. Использование небезопасных экземпляров DTDProcessing при ссылке или разрешении внешних источников сущностей или настройке небезопасных значений в XML может привести к раскрытию информации. |
CA3147: пометьте обработчики команд с помощью ValidateAntiForgeryToken | При разработке контроллера MVC ASP.NET следует учитывать атаки с подделкой межсайтовых запросов (CSRF). Атака с использованием подделки межсайтовых запросов позволяет отправлять вредоносные запросы от пользователя, прошедшего проверку подлинности, в контроллер MVC ASP.NET. |
CA5350: не используйте ненадежные алгоритмы шифрования | Ненадежные алгоритмы шифрования и функции хэширования еще используются сегодня по ряду причин, но они не должны использоваться для обеспечения конфиденциальности или целостности данных, которые они защищают. Это правило срабатывает при обнаружении в коде алгоритмов TripleDES, SHA1 или RIPEMD160. |
CA5351: не используйте ослабленные алгоритмы шифрования | Ослабленные алгоритмы шифрования не считаются безопасными, и их использование настоятельно не рекомендуется. Это правило срабатывает при обнаружении в коде хэш-алгоритма MD5 или алгоритмов шифрования RC2 или DES. |
CA5358: не используйте небезопасные режимы шифров | Не используйте небезопасные режимы шифрования |
CA5359: не отключайте проверку сертификата | Сертификат может помочь при проверке подлинности удостоверения сервера. Клиенты должны проверить сертификат сервера, чтобы обеспечить отправку запросов на нужный сервер. Если ServerCertificateValidationCallback всегда возвращает значение true , любой сертификат будет проходить проверку. |
CA5360: не вызывайте опасные методы в десериализации | Небезопасная десериализация — это уязвимость, которая возникает, когда недоверенные данные используются для нарушения логики приложения, проведения атаки типа "отказ в обслуживании" или даже для выполнения произвольного кода после десериализации. Злоумышленники часто могут злоупотреблять этими функциями десериализации, когда приложение десериализует недоверенные данные, которые находятся под контролем злоумышленников. В частности, они могут вызывать опасные методы в процессе десериализации. Успешные атаки небезопасной десериализации могут позволить злоумышленнику выполнять такие действия, как атаки типа "отказ в обслуживании", обходы проверки подлинности и удаленное выполнение кода. |
CA5361: не отключайте стойкое шифрование в защищенном канале | Установка 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 с безопасным сопоставителем или с отключенной обработкой DTD. |
CA5373: не используйте устаревшую функцию вывода ключей | Это правило обнаруживает вызов методов наследования слабых ключей System.Security.Cryptography.PasswordDeriveBytes и Rfc2898DeriveBytes.CryptDeriveKey . Метод System.Security.Cryptography.PasswordDeriveBytes использовал слабый алгоритм PBKDF1. |
CA5374: не используйте XslTransform | Это правило проверяет, создается ли экземпляр System.Xml.Xsl.XslTransform в коде. System.Xml.Xsl.XslTransform теперь является устаревшим и не должен использоваться. |
CA5375: не используйте подписанный URL-адрес учетной записи | Подписанный URL-адрес (SAS) учетной записи может делегировать доступ к операциям чтения, записи и удаления в контейнерах больших двоичных объектов, таблицах, очередях и общих папках, которые запрещены в SAS службы. Однако он не поддерживает политики уровня контейнеров и обладает меньшей гибкостью и уровнем контроля предоставленных разрешений. Если злоумышленники его получат, они смогут с легкостью взломать вашу учетную запись хранения. |
CA5376: использование SharedAccessProtocol HttpsOnly | SAS — это конфиденциальные данные, которые нельзя передавать в виде обычного текста по протоколу HTTP. |
CA5377: использование политики доступа на уровне контейнера | Политику доступа на уровне контейнера можно изменить или отозвать в любое время. Она обеспечивает большую гибкость и контроль над предоставляемыми разрешениями. |
CA5378: не отключайте ServicePointManagerSecurityProtocols | Задание для Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols значения true разрешает использовать только протокол TLS 1.0 в Windows Communication Framework. Эта версия 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 , PATCH PUT или DELETE запроса без проверки маркера антифоргерии может быть уязвима для межсайтовых атак подделки запросов. Атака с использованием подделки межсайтовых запросов позволяет отправлять вредоносные запросы от пользователя, прошедшего проверку подлинности, в контроллер MVC ASP.NET Core. |
CA5392: использование атрибута DefaultDllImportSearchPaths для P/Invokes | По умолчанию функции P/Invoke используют пробу DllImportAttribute нескольких каталогов, включая текущий рабочий каталог для загрузки библиотеки. Это может быть проблемой безопасности для некоторых приложений, приводящей к перехвату библиотеки DLL. |
CA5393: не используйте небезопасное значение DllImportSearchPath | В каталогах поиска DLL по умолчанию и каталогах сборок может находиться вредоносная библиотека DLL. Или в зависимости от того, откуда запускается приложение, в каталоге приложения может быть вредоносная библиотека DLL. |
CA5394: не используйте небезопасную случайность | Использование криптографически слабого генератора псевдослучайного числа может позволить злоумышленнику предсказать, какое значение будет создано с учетом безопасности. |
CA5395: атрибут Miss 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" должны совпадать во всех реализациях интерфейса или переопределениях. |
Условные обозначения
В следующей таблице показан тип сведений, предоставляемых для каждого правила в справочной документации.
Позиция | Описание |
---|---|
Тип | Имя типа для правила. |
Идентификатор правила | Уникальный идентификатор правила. Идентификатор и категория правила используются для подавления предупреждений в исходном коде. |
Категория | Категория правила, например безопасность. |
Исправление является критическим или не критическим | Является ли исправление нарушения правила критическим изменением. Критическое изменение означает, что сборка, зависящая от целевого объекта, вызвавшего нарушение, не перекомпилируется с новой исправленной версией или может вызвать сбой во время выполнения из-за изменения. Если доступно несколько исправлений и по крайней мере одно является критическим изменением, а другое — нет, указываются оба параметра. |
Причина | Конкретный управляемый код, вызывающий создание предупреждения правилом. |
Description | Описывает проблемы, вызвавшие предупреждение. |
Устранение нарушений | Описывает, как изменить исходный код, чтобы соблюсти правило и предотвратить создание предупреждений. |
Когда лучше отключить предупреждения | Описывает, когда можно безопасно подавить предупреждение из правила. |
Пример кода | Примеры, которые нарушают правила, и исправленные примеры, соблюдающие правило. |
Связанные правила | Связанные правила. |
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.