Набор правил "Рекомендуемые правила для смешанных сред"
Набор правил "Минимально рекомендованные правила Microsoft" используется для того, чтобы сосредоточиться на наиболее критических проблемах проектов C++, поддерживающих среду CLR, включая возможные бреши в системе безопасности, сбои приложения и другие важные ошибки логики и дизайна.Этот набор правил следует включать во все пользовательские наборы правил, создаваемые для проектов C++, которые поддерживают среду CLR.Этот набор правил можно настраивать в выпуске Visual Studio Professional или в выпусках более высокого уровня.
Правило |
Описание |
---|---|
Использование неинициализированной памяти |
|
Разыменование пустого указателя |
|
Использование значения unchecked |
|
Возвращаемое значение игнорируется. |
|
Нулевое завершение из вызова |
|
Отсутствует нулевое завершение |
|
Недопустимое соединение |
|
Отсутствующий строковый аргумент для форматирования функции |
|
Отсутствующий целочисленный аргумент для форматирования функции |
|
Отсутствующий аргумент-указатель для форматирования функции |
|
Отсутствующий аргумент-указатель на строку для форматирования функции |
|
Возвращение не инициализированной памяти |
|
Индекс превышает максимальный размер буфера |
|
Индекс превышает максимальный размер буфера стека |
|
Недопустимое приведение HRESULT к BOOL |
|
Недопустимое приведение BOOL к HRESULT |
|
Недопустимое вставленное компилятором приведение BOOL к HRESULT |
|
Недопустимая проверка HRESULT с использованием NOT |
|
Недопустимое сравнение HRESULT с -1 |
|
Недопустимое присваивание HRESULT значения -1 |
|
Недопустимое использование HRESULT в качестве логического типа |
|
Ненулевая константа с логическим ИЛИ |
|
Логическое ИЛИ с ненулевой константой |
|
Ноль с логическим И теряет побочные эффекты |
|
Вызвана локальная раскрутка стека |
|
Создание пустого (NULL) списка DACL |
|
Неосвобожденные дескрипторы адресов |
|
Незащищенное использование функции alloca |
|
Использование завершенного потока |
|
Невызываемый код в операторе switch, ограниченном побитовым ИЛИ |
|
Использование байтовой арифметики |
|
Чрезмерное использование стеков |
|
Использование alloca в цикле |
|
Пропущены скобки при приведении |
|
Разыменование указателя игнорируется |
|
Отсутствующий аргумент с плавающей запятой для форматирования функции |
|
Дополнительный аргумент для форматирования функции |
|
Аргумент, отличный от числа с плавающей запятой, для форматирования функции |
|
Аргумент, отличный от целочисленного значения, для форматирования функции |
|
Аргумент, отличный от символьного значения, для форматирования функции |
|
Недопустимое приведение строк |
|
Недопустимый вызов CreateProcess |
|
Несоответствие между созданием массива и удалением скалярной переменной |
|
Несоответствие между созданием скалярной переменной и удалением массива |
|
Несоответствие между выделением и освобождением памяти |
|
Приоритет битовых связей |
|
Присваивание вместо проверки |
|
Несоответствие между созданием примитивного массива и удалением скалярной переменной |
|
Недопустимый аргумент-объект для форматирования функции |
|
Логическое ИЛИ для константы |
|
Ненулевое логическое ИЛИ приводит к потере побочных эффектов |
|
Избыточная проверка |
|
Результат взаимного включения через логическое И всегда равен false |
|
Результат взаимного исключение через логическое ИЛИ всегда равен true |
|
Логическое НЕ, затем побитовое И |
|
Логическое НЕ, затем побитовое ИЛИ |
|
Перебор цикла идет вверх от максимального значения |
|
Перебор цикла идет вниз от минимального значения |
|
Тело цикла никогда не выполняется |
|
Бесконечный цикл |
|
Цикл выполняется только один раз |
|
Результат сдвига приводится к значению большего размера |
|
Сравнение битового поля с логическим значением |
|
Недопустимый символьный аргумент для форматирования функции |
|
Недопустимый аргумент строк расширенных символов для форматирования функции |
|
Рассогласованная использование размера и количества |
|
Неверный вызов функции аргумента переменной |
|
Утечка при использовании Realloc |
|
Неверная константа в фильтре исключений |
|
Исключения продолжает цикл выполнения |
|
Приоритет побитового ИЛИ |
|
Двойное отрицание |
|
Исключение продолжает поиск |
|
Игнорируется запятой |
|
Копирование строк вместо сравнения строк |
|
Возможное несоответствие типов аргументов |
|
Недопустимые флаги VirtualFree |
|
Недопустимый параметр VirtualFree |
|
Недопустимый размер VirtualFree |
|
Утечка в дескрипторе процесса |
|
Отсутствуют сведения о выключении |
|
Переполнение буфера из-за преобразования счетчика элементов в счетчик байтов |
|
Деление размера указателя |
|
Переполнение при чтении |
|
Переполнение при записи |
|
Недопустимое значение параметра |
|
Недопустимое значение параметра |
|
Недопустимое свойство атрибута |
|
Конфликтующие значения свойств атрибута |
|
Ссылка на параметр не может иметь значение null |
|
Значение null для типа, отличного от указателя |
|
MustCheck для типа void |
|
Размер буфера для типа, отличного от указателя, или массива |
|
Несоответствие null нулю при разыменовании |
|
Доступ для записи константы |
|
Возврат, используемый в предусловии |
|
Строка, заканчивающаяся нулем, для типа, отличного от указателя |
|
Значением MustCheck должно быть Yes или No. |
|
Размер элемента без учета размера буфера |
|
Размер буфера превышает размер массива |
|
Размер буфера для типа, отличного от указателя |
|
Нет свойств атрибута |
|
Допустимый размер для буфера, не поддерживающего чтение |
|
Допустимый размер для записи в буфер, не поддерживающий запись |
|
Недопустимая аннотация: значение свойства NeedsRelease должно быть равно Yes или No |
|
Недопустимое разыменование строки размера |
|
Недопустимый тип строки размера |
|
Недопустимый параметр строки размера |
|
Недопустимое недостижимое местоположение строки размера |
|
Недопустимый тип буфера строки размера |
|
Недопустимая аннотация: Свойство "NeedsRelease" не может быть использовано со значениями типа void |
|
Неопознанный стиль строки формата |
|
Если для данной функции использовать аннотации атрибута, все ее существующие аннотации __declspec станут недействительными |
|
Неверно указан размер: синтаксический анализ выражения невозможен |
|
Недопустимое Deref= или Notref=: синтаксический анализ выражения невозможен |
|
Значение не является одним из допустимых значений (Yes/No/Maybe) |
|
Значение не является строковым значением |
|
Значение не является числом |
|
Непредвиденная ошибка выражения аннотации |
|
Ожидаемое количество аргументов для аннотации не соответствует фактическому числу аргументов для аннотации |
|
Непредвиденная ошибка аннотации для аннотации |
|
Не удалось сохранить XML-файл журнала |
|
Состояние гонки |
|
Не удается правильно использовать заблокированную операцию |
|
Вызывающей стороне не удается удержать блокировку |
|
Вызывающей стороне не удается освободить блокировку |
|
Вызывающая сторона не может удерживать никакие блокировки |
|
Не удается освободить блокировку |
|
Не удается получить или удержать блокировку |
|
Освобождение неудерживаемой блокировки |
|
Ошибка примечания Concurrency SAL |
|
Выражение не равно значению true при этом вызове |
|
Аннотируемый параметр должен быть указателем |
|
Классы данной функции не совпадают с классами функции в typedef, используемом для ее определения |
|
Назначаемая или передаваемая функция должна иметь аннотацию _Function_class_ по крайней мере для одного из классов |
|
Функция, которой назначается указатель, аннотирована классом функции, не содержащимся в списке класса(ов) функции. |
|
Тип фактического параметра должен в точности совпадать с типом |
|
Обращение к переменной, доступ к которой возможен только через функцию с модификатором Interlocked, должно выполняться через такую функцию |
|
Обращение к локальной переменной через функцию Interlocked |
|
Вызов функции должен выполняться из блока try/except |
|
Переменный аргумент должен быть константой (литералом). |
|
Константный аргумент должен быть переменной. |
|
Попробуйте использовать другую функцию |
|
заметка Error |
|
Вызов функции не должен выполняться из блока try/except |
|
Аргумент передается в функцию, которая ожидает указатель на объект (а не указатель на указатель) |
|
Разыменование пустого (NULL) указателя.Указатель содержит то же NULL значение, что и содержал другой указатель. |
|
Аргумент должен быть единственным значением, однако является копией значения, находящегося в указателе |
|
Переменная содержит значение, которое необходимо проверить |
|
Требование не удовлетворяется. (Результат выражения не равен значению true.) |
|
Недопустимая ссылка на нестатический член |
|
Неоднозначная ссылка на член класса. |
|
_Success_ или _On_failure_ используется в недопустимом контексте |
|
Левый операнд указывает на структуру, используйте '->' |
|
Левый операнд является структурой, используйте "." |
|
Для объявления символа имеется конфликтующее объявление. |
|
Аннотации для контекста __on_failure не должны находиться в явном предварительном контексте |
|
Для SAL_context ожидалось статическое имя контекста |
|
Выражение указателя требуется для аннотации |
|
Аннотация _Use_decl_annotations_ должна использоваться для ссылки, без изменения, перед объявлением. |
|
Допустимые имена параметров атрибута: p1...p9 |
|
typefix нельзя применять к параметру, который уже имеет typefix |
|
Аннотация checkReturn применяется только к постусловиям для параметра конкретной функции. |
|
Для функции число параметров для аннотации не совпадает с числом параметров, обнаруженных в файле |
|
Для функции paramteer параметр аннотации не соответствует параметру, обнаруженном в файле |
|
Для параметра аннотации ожидался член перечисления |
|
Для параметра в аннотации ожидалось целочисленное выражение |
|
Для параметра в аннотации ожидалось строковое выражение |
|
__yes, __no или __maybe требуется для аннотации |
|
Не найден ожидаемый токен/идентификатор для аннотации, параметр |
|
Для аннотации требуются параметры. |
|
Невозможно определить верное число обязательных параметров в аннотации |
|
Аннотация не может также быть PrimOp (в текущем объявлении) |
|
Аннотация не может также быть PrimOp (см. предыдущее объявление) |
|
Параметр аннотации: невозможно использовать тип в аннотациях |
|
Аннотация не поддерживает параметры |
|
В типе параметра нет члена. |
|
Аннотация доступная только для массива |
|
pre, post или deref не применено для аннотации |
|
pre, post или deref применено к блоку |
|
Выражение __at не применяется к текущей функции |
|
Функция не может использоваться изолированно как аннотация |
|
Аннотацию нельзя использовать в выражениях |
|
Аннотация в параметре больше не поддерживается. |
|
Аннотация в параметре содержит несколько значений value, stringValue и longValue.Используйте paramn=xxx |
|
Аннотация в параметре одновременно содержит значение value, stringValue или longValue и выражение paramn=xxx.Используйте только paramn=xxx |
|
Аннотация в параметре содержит param2, но не содержит param1 |
|
Аннотация для функции в параметре не распознана |
|
Аннотации для функции в параметре требуется больше разыменований, чем допускает фактический аннотируемый тип. |
|
Аннотация для функции содержит аннотацию параметра или внешнюю аннотацию, не поддающуюся синтаксическому анализу |
|
Аннотация для функции аннотирует "this" в функции, не являющейся членом |
|
Аннотация параметра для функции не соответствует типу параметра |
|
Несогласованная аннотация для функции: предыдущий экземпляр содержит ошибку. |
|
Несогласованная аннотация для функции: данный экземпляр содержит ошибку. |
|
Несогласованная аннотация для функции: параметр имеет другие аннотации в этом экземпляре. |
|
Несогласованная аннотация для функции: параметр имеет другие аннотации в этом экземпляре. |
|
dynamic_cast<>() не поддерживается в аннотациях |
|
В функции обнаружена синтаксическая ошибка аннотации |
|
Во встроенной функции обнаружена синтаксическая ошибка условной аннотации: |
|
Значения списков результата должны быть константами. |
|
В функции обнаружена синтаксическая ошибка аннотаций. |
|
Аннотация для функции: параметр не согласуется с объявлением функции при проверке |
|
Функция: подсказки не согласуются с объявлением функции |
|
Значение параметра для _Macro_value_ равно NULL |
|
Для символа обнаружен begin без соответствующего end. |
|
Для символа обнаружен end без соответствующего begin |
|
Строки форматирования должны находиться в предусловиях |
|
Для функции: синтаксическая ошибка в параметре |
|
Для функции: ошибка рядом с окончанием |
|
Для функции: синтаксическая ошибка в аннотации _At_() (не распознано имя параметра) |
|
Для функции: синтаксическая ошибка в аннотации _At_() (недопустимое имя параметра) |
|
Для функции: ReadableTo или WritableTo не содержало спецификацию ограничения в качестве параметра |
|
количество внешних элементов в аннотации для функции превышает фактическое число параметров |
|
постусловие null/notnull в deref уровня 0 не имеет смысла для функции. |
|
несовместимые типы операндов выражения для оператора |
|
Аннотации отсутствуют для первого объявления функции. |
|
Дополнительный оператор _Deref_ был найден в аннотации. |
|
Неоднозначный оператор _Deref_ был найден в аннотации. |
|
Неправильно помещенный оператор _Notref_ был применим к токену. |
|
При разборе токена была обнаружена ошибка. |
|
Заметка в параметре устарела |
|
Заметка в параметре устарела |
|
Аннотация описывает ситуацию, к которой неприменимы условия. |
|
Аннотация описывает ситуацию, когда динамическое значение (переменная) не может использоваться в условии. |
|
Типы, которым принадлежат освобождаемые поля, должны быть освобождаемыми |
|
Правильно объявите обработчики событий |
|
Пометьте сборки атрибутом AssemblyVersionAttribute |
|
Методы интерфейса должны быть доступны для вызова дочерним типам |
|
Типы, которым принадлежат собственные ресурсы, должны быть освобождаемыми |
|
Переместите P/Invokes в класс NativeMethods |
|
Не скрывайте методы базового класса |
|
Следует правильно реализовывать IDisposable |
|
Не вызывайте исключения в непредвиденных местах |
|
Избегайте повторяющихся сочетаний клавиш быстрого доступа |
|
Необходимо наличие точек входа P/Invoke |
|
Методы P/Invoke не должны быть видимыми |
|
Типы макета Auto не должны быть видимыми для COM |
|
Вызовите GetLastError сразу после P/Invoke |
|
Базовые типы, относящиеся к типу видимых COM-клиенту, должны быть видимыми для COM |
|
Методы регистрации COM должны быть согласованы |
|
Правильно объявите методы P/Invoke |
|
Удалите пустые методы завершения |
|
Поля типа значения должны быть переносимыми |
|
Объявления P/Invoke должны быть переносимыми |
|
Не блокируйте объекты со слабой идентификацией |
|
Проанализируйте SQL-запросы с целью выявления уязвимостей безопасности |
|
Укажите тип маршалинга для строковых аргументов P/Invoke |
|
Проверьте объявляемые параметры безопасности типов значений |
|
Указатели не должны быть видимыми |
|
Защищенные типы не должны предоставлять поля |
|
Безопасность метода должна быть надмножеством типа |
|
APTCA-методы должны вызывать только APTCA-методы |
|
APTCA-типы должны расширять только базовые APTCA-типы |
|
Не используйте косвенное представление методов с требованиями ссылки |
|
Переопределяющие требования ссылки должны быть идентичны базовым |
|
Ограничьте уязвимые предложения finally во внешних блоках try |
|
Для требований ссылок на тип необходимы требования наследования |
|
Критические с точки зрения безопасности типы могут не участвовать в эквивалентности типов |
|
Конструкторы по умолчанию должны быть по меньшей мере такими же критическими, как конструкторы по умолчанию базового типа |
|
Делегаты должны привязываться к методам с соответствующей прозрачностью |
|
Методы должны сохранять согласованную прозрачность при переопределении базовых методов |
|
Прозрачные методы должны содержать только поддающийся проверке IL |
|
Прозрачные методы не должны вызывать методы с атрибутом SuppressUnmanagedCodeSecurity |
|
Прозрачный код не должен ссылаться на элементы, критичные в плане безопасности |
|
Прозрачные методы не должны удовлетворять требования LinkDemand |
|
Типы должны быть настолько же критическими, как их базовые типы и интерфейсы. |
|
Прозрачные методы могут не использовать утверждения безопасности |
|
Прозрачные методы не должны вызывать машинный код |
|
Следует повторно вызывать исключение для сохранения сведений о стеке |
|
Не удаляйте объекты несколько раз |
|
Используйте встроенную инициализацию статических полей типов значений |
|
Не помечайте обслуживаемые компоненты атрибутом WebMethod |
|
Высвободите высвобождаемые поля |
|
Не вызывайте переопределяемые методы в конструкторах |
|
Высвобождаемые типы должны объявлять метод завершения |
|
Методы завершения должны вызывать метод завершения базового класса |
|
Реализуйте конструкторы сериализации |
|
Перегружать равенство операторов следует при перегрузке ValueType.Equals |
|
Отметьте точки входа Windows Forms меткой STAThread |
|
Пометьте все несериализуемые поля |
|
Вызовите методы базового класса для типов ISerializable |
|
Пометьте типы ISerializable атрибутом SerializableAttribute |
|
Правильно реализуйте методы сериализации |
|
Правильно реализуйте ISerializable |
|
Предоставьте правильные аргументы методам форматирования |
|
Правильно выполните проверку NaN |