Результаты Bug Finder найдены в режиме быстрого анализа

В режиме быстрого анализа Bug Finder проверяет только подмножество дефектов и правил кодирования. В приведенных ниже таблицах перечислены результаты, которые можно найти в быстром анализе. См. также Use fast analysis mode for Bug Finder (-fast-analysis).

Эти дефекты и стандартные нарушения кодирования либо обнаруживаются ранее в анализе, либо используют архивную информацию предыдущего анализа. Результаты анализа сравнительно легче просмотреть и исправить, потому что большинство результатов можно понять, сосредоточившись на двух или трех строках кода (линия с дефектом и одна или две предыдущие линии).

Из-за упрощенного характера анализа вы можете увидеть меньше дефектов в режиме быстрого анализа по сравнению с регулярным анализом Bug Finder.

Дефекты Polyspace Bug Finder

Статическая память

ИмяОписание
Переполнение буфера из неправильного спецификатора строкового формата
(str_format_buffer_overflow)

Спецификатор строкового формата заставляет буферный аргумент стандартных библиотечных функций переполняться

Ненадежное приведение указателя на функцию
(func_cast)

Указатель на функцию приведен к другому указателю на функцию с другим аргументом или возвращаемым типом

Ненадежное приведение указателя мыши
(ptr_cast)

Указатель неявно приведен к различным типам данных

Программирование

ИмяОписание
Копия перекрывающейся памяти
(overlapping_copy)

Исходный и целевой аргументы функции копирования имеют перекрывающуюся память

Исключение получено значением
(excp_caught_by_value)

catch оператор принимает объект по значению

Обработчик исключений, скрытый предыдущим обработчиком
(excp_handler_hidden)

catch оператор не достигается из-за предыдущего оператора catch для того же исключения

Формат форматирования спецификаторов строк и аргументов
(string_format)

Спецификаторы строк не совпадают с соответствующими аргументами

Неправильная инициализация массива
(improper_array_init)

Неправильная инициализация массива при использовании инициализаторов

Недопустимое использование оператора = = (равенство)
(bad_equal_equal_use)

Операция равенства в операторе о присвоении

Недопустимое использование оператора = (назначение)
(bad_equal_use)

Назначение в условном операторе

Недопустимое использование операции с плавающей точкой
(bad_float_op)

Неточное сравнение переменных с плавающей точкой

Отсутствует значение null в строковые массивы
(missing_null_char)

Строка не заканчивается символом null

Перекрывающееся назначение
(overlapping_assign)

Перекрытие памяти между левой и правой сторонами назначения

Возможно, непреднамеренная оценка выражения из-за правил приоритета оператора
(operator_precedence)

Правила приоритета операторов вызывают неожиданный порядок оценки в арифметическом выражении

Небезопасное преобразование между указателем и целым числом
(bad_int_ptr_cast)

Несогласованные или недопустимые результаты преобразований между указателем мыши и целых типов

Неправильный тип, используемый в sizeof
(ptr_sizeof_mismatch)

sizeof аргумент не совпадает с указанным типом

Поток данных

ИмяОписание
Код деактивирован постоянным ложным условием
(deactivated_code)

Сегмент кода деактивирован #if 0 директива или if(0) состояние

Отсутствует оператор возврата
(missing_return)

Функция не возвращает значение, хотя возвращаемый тип не является пустым

Статическая незакрытая функция
(uncalled_func)

Функция со статическими возможностями вызывается в файле

Переменная затенение
(var_shadowing)

Переменная скрывает другую переменную с таким же именем с вложенной возможностями

Объектно-ориентированный

ИмяОписание
*this не возвращен в операторе назначения копии
(return_not_ref_to_this)

оператор = method не возвращает указатель на текущий объект

Оператор назначения базового класса не вызывается
(missing_base_assign_op_call)

Оператор назначения копирования не вызывает операторов назначения копирования базовых подобъектов

Деструктор базового класса не виртуальный
(dtor_not_virtual)

Класс не может вести себя полиморфно для удаления производных объектов классов

Копируйте конструктор, не вызванный в списке инициализации
(missing_copy_ctor_call)

Конструктор копирования не вызывает конструкторы копирования некоторых представителей или базовых классов

Несовместимые типы предотвращают переопределение
(virtual_func_hiding)

Метод производного класса скрывает метод виртуального базового класса вместо того, чтобы переопределять его

Представитель не инициализирован в конструкторе
(non_init_member)

Конструктор не инициализирует некоторые представители класса

Отсутствует явное ключевое слово
(missing_explicit_keyword)

Конструктор пропускает явный спецификатор

Отсутствует виртуальное наследство
(missing_virtual_inheritance)

Базовый класс наследуется виртуально и невиртуально в одной иерархии

Разрезание объектов
(object_slicing)

Производный объект класса передан значением, чтобы функционировать с параметром базового класса

Частичное переопределение перегруженных виртуальных функций
(partial_override)

Класс переопределяет долю унаследованных виртуальных функций с заданным именем

Возврат указателя non const к инкапсулированному представителю данных
(breaking_data_encapsulation)

Метод возвращает указатель или ссылку на внутренний представитель объекта

Самоопределение, не протестированное в операторе
(missing_self_assign_test)

Оператор назначения копирования не проверяет на самоопределение

Безопасность

ИмяОписание
Указатель на функцию, назначенный с абсолютным адресом
(func_ptr_absolute_addr)

Постоянное выражение используется, поскольку адрес функции уязвим для инъекции кода

Передовая практика

ИмяОписание
Битовая и арифметическая операция на тех же данных
(bitwise_arith_mix)

Оператор со смешанными побитовыми и арифметическими операциями

Удаление пустого указателя
(delete_of_void_ptr)

delete работает с void* указатель, указывающий на объект

Жестко закодированный buffer size
(hard_coded_buffer_size)

Размер буфера памяти является числовым значением вместо символьной константы

Жестко закодированная граница цикла
(hard_coded_loop_boundary)

Граница цикла является числовым значением вместо символьной константы

Большой аргумент pass-by-value
(pass_by_value)

Большой аргумент передан значением между функциями

Линия с несколькими операторами
(more_than_one_statement)

Несколько операторы в линии

Отсутствие пропуска в корпусе переключателя
(missing_switch_break)

Без комментариев в конце варианта switch без оператора break

Отсутствует сброс свободного указателя мыши
(missing_freed_ptr_reset)

Указатель свободен, не сопровождается оператором сброса, чтобы удалить оставшиеся данные

Неиспользованный параметр
(unused_parameter)

Прототип функции имеет параметры, не считанные или записанные в тело функции

MISRA C:2004 и MISRA AC AGC Правила

Программа проверяет следующие правила в начале анализа.

Языковые расширения

ПравилоОписание
2.1

Язык сборки должен быть инкапсулирован и изолирован.

2.2

Исходный код должен использовать только /* */ комментарии стиля.

2.3

Последовательность символов /* не должны использоваться в рамках комментария.

Документация

ПравилоОписание
3.4

Все виды использования #pragma директива должна быть задокументирована и разъяснена.

Наборы символов

ПравилоОписание
4.1

Должны использоваться только те эвакуационные последовательности, которые определены в стандарте ISO C.

4.2

Триграфы не должны использоваться.

Идентификаторы

ПравилоОписание
5.2

Идентификаторы во внутренних возможностях не должны использовать то же имя, что и идентификаторы во внешних возможностях, и поэтому скрывать этот идентификатор.

Типы

ПравилоОписание
6.1

Обычный тип char должен использоваться только для хранения и использования значений символов.

6.2

Подписанный и беззнаковый тип char должен использоваться только для хранения и использования числовых значений.

6.3

typedefs, которые указывают на размер и сигнальность, должны использоваться вместо основных типов.

6.4

Битовые поля должны быть определены только для типа unsigned int или signed int.

6.5

Битовые поля типа signed int длина должна быть не менее 2 бит.

Константы

ПравилоОписание
7.1

Восьмеричные константы (кроме нуля) и восьмеричные выходные последовательности не должны использоваться.

Декларации и определения

ПравилоОписание
8.1

Функции должны иметь объявления прототипа, и прототип должен быть виден как при определении функции, так и при вызове.

8.2

Всякий раз, когда объект или функция объявлены или определены, его тип четко указывается.

8.3

Для каждого функционального параметра тип, указанный в декларации и определении, должен быть идентичным, а типы возврата должны также совпадать.

8.5

В заголовочном файле не должно быть определений объектов или функций.

8.6

Функции должны всегда объявляться в возможностях файла.

8.7

Объекты должны быть определены в возможности, если они доступны только из одной функции.

8.8

Внешний объект или функция должны быть объявлены в одном файле и только в одном файле.

8.9

Идентификатор с внешним редактированием должен иметь только одно внешнее определение.

8.11

The static спецификатор класса памяти должен использоваться в определениях и объявлениях объектов и функций, имеющих внутреннее редактирование

8.12

Когда массив объявлен с внешним редактированием, его размер должен быть указан явным или неявным образом путем инициализации.

Инициализация

ПравилоОписание
9.2

Скобки должны использоваться для указания и соответствия структуры в ненулевой инициализации массивов и структур.

9.3

В списке перечислителей = конструкция не должна использоваться для явной инициализации представителей, отличных от первой, если только все элементы не инициализированы явным образом.

Преобразование арифметического типа

ПравилоОписание
10.1

Значение выражения целого типа не должно неявно преобразовываться в другой базовый тип, если:

  • Это не преобразование в более широкий целый тип той же сигнальности, или

  • Выражение комплексное, или

  • Выражение не является постоянным и является аргументом функции, или

  • Выражение не является постоянным и является возврат выражением

10.2

Значение выражения плавающего типа не должно неявно преобразовываться в другой тип, если

  • Это не преобразование в более широкий плавающий тип, или

  • Выражение комплексное, или

  • Выражение является аргументом функции, или

  • Выражение является возвратом выражением

10.3

Значение комплексного выражения целого типа может быть приведено только к типу, который является более узким и имеет ту же сигнальность, что и базовый тип выражения.

10.4

Значение комплексного выражения типа с плавающей точкой может быть приведено только к более узкому плавающему типу.

10.5

Если побитовый оператор ~ и << применяются к операнду базового типа unsigned char или unsigned short, результат должен быть немедленно приведен к базовому типу операнда

10.6

Суффикс «U» применяется ко всем константам unsigned типы.

Преобразование типа указателя

ПравилоОписание
11.1

Преобразование не должно выполняться между указателем на функцию и любым типом, отличным от интегрального типа.

11.2

Преобразование не должно выполняться между указателем на объект и любым типом, отличным от интегрального типа, другим указателем на тип объекта или указателем на void.

11.3

Приведение не должно выполняться между типом указателя и интегральным типом.

11.4

Приведение не должно выполняться между указателем на тип объекта и другим указателем на тип объекта.

11.5

Отливка не должна выполняться, чтобы удалить какие-либо const или volatile проверка типа, адресованного указателем

Выражения

ПравилоОписание
12.1

Ограниченная зависимость должна быть помещена в выражения в правилах приоритета операторов С.

12.3

The sizeof оператор не должен использоваться в выражениях, содержащих побочные эффекты.

12.5

Операнды логического && или || должны быть первичными выражениями.

12.6

Операнды логических операторов (&&, || и !) должен быть эффективно логическим. Выражение, которое эффективно является логическим, не должно использоваться как операнды для операторов, отличных от (&&, || или !).

12.7

Битовые операторы не должны применяться к операторам, основной тип которых подписан.

12.9

Оператор унарного минуса не применяется к выражению, базовый тип которого не подписан.

12.10

Оператор запятыми не должен использоваться.

12.11

Оценка постоянного беззнакового выражения не должна приводить к обертыванию.

12.12

Базовые битовые представления значений с плавающей точкой не должны использоваться.

12.13

Шаг (++) и сокращение (--) операторы не должны смешиваться с другими операторами в выражении

Выражения оператора управления

ПравилоОписание
13.1

Операторы назначения не должны использоваться в выражениях, которые дают логические значения.

13.2

Тесты значения против нуля должны быть сделаны явными, если операнд не является фактически логическим.

13.3

Выражения с плавающей точкой не должны проверяться на равенство или неравенство.

13.4

Управляющее выражение for оператор не должен содержать никаких объектов плавающего типа.

13.5

Три выражения for оператор должен касаться только управления циклом.

13.6

Числовые переменные, используемые в for цикл для подсчета итерации не должен изменяться в теле цикла.

Управляйте потоком

ПравилоОписание
14.3

Все операторы без нуля должны либо

  • иметь, по крайней мере, один побочный эффект, однако, выполненный, или

  • привести к изменению потока управления.

14.4

The goto оператор не должно использоваться.

14.5

The continue оператор не должно использоваться.

14.6

Для любого оператора итерации должно быть самое большее одно break оператор, используемый для завершения цикла.

14.7

Функция должна иметь одну точку выхода в конце функции.

14.8

Оператор, образующее тело switch, while, do while или for Оператор должен быть составным оператором.

14.9

Система координат if (выражение) за конструкцией следует составной оператор. The else за ключевым словом следует либо составной оператор, либо другой if оператор.

14.10

Все if else if конструкции должны содержать окончательную else пункт.

Операторы Switch

ПравилоОписание
15.0

Между switch обнаружен недостижимый код оператор и первый case.

15.1

A switch метка должна использоваться только в том случае, если самый близкий составной оператор является телом switch оператор

15.2

Безусловное break оператор прекращает действие каждого непустого switch пункт.

15.3

Окончательный пункт switch оператор должно быть default пункт.

15.4

A switch выражение не должно представлять значение, которое эффективно является логическим.

15.5

Каждый switch оператор должно иметь по крайней мере один case пункт.

Функции

ПравилоОписание
16.1

Функции не должны определяться переменным числом аргументов.

16.3

Идентификаторы должны быть даны для всех параметров в объявлении прототипа функции.

16.5

Функции без параметров должны быть объявлены с типом параметра void.

16.6

Количество аргументов, переданных функции, должно совпадать с количеством параметров.

16.8

Все выходные пути из функции с не- void возвращаемый тип должен иметь явный оператор возврата с выражением.

16.9

Идентификатор функции должен использоваться только с предыдущим &, или со списком параметров в круглых скобках, который может быть пустым.

Указатели и массивы

ПравилоОписание
17.4

Индексация массива должна быть единственно допустимой формой арифметики указателя.

17.5

Тип не должен содержать более 2 уровней опосредования указателя.

Структуры и объединения

ПравилоОписание
18.1

Все типы конструкций или объединений должны быть завершены в конце модуля перевода.

18.4

Объединения не должны использоваться.

Директивы предварительной обработки

ПравилоОписание
19.1

#include операторам в файле должны предшествовать только другие директивы или комментарии предварительной обработки.

19.2

Нестандартные символы не должны встречаться в именах заголовочных файлов в #include директивы.

19.3

The #include за директивой следует последовательность < filename > или «filename».

19.4

Макросы C должны расширяться только на инициализатор скобок, константу, выражение в круглых скобках, квалификатор типа, спецификатор класса памяти или конструкцию нуль.

19.5

Макросы не должны быть #define-d и #undef-d в блоке.

19.6

#undef не должны использоваться.

19.7

Функция должна использоваться в выборе функции, подобной макросу.

19.8

Функциональный макрос не должен вызываться без всех его аргументов.

19.9

Аргументы в функциональный макрос не должны содержать лексемы, которые выглядят как директивы предварительной обработки.

19.10

В определении функционального макроса каждый образец параметра должен быть заключен в круглые скобки, если он не используется в качестве операнда # или ##.

19.11

Все идентификаторы макросов в директивах препроцессора должны быть определены перед использованием, кроме #ifdef и #ifndef директивы препроцессора и defined() оператор.

19.12

Должно быть самое большее одно вхождение # или ## операторы препроцессора в одной макро- определение.

19.13

The # и ## операторы предпроцессора не должны использоваться.

19.14

Определенный оператор препроцессора должен использоваться только в одной из двух стандартных форм.

19.15

Необходимо принять меры предосторожности, порядок предотвратить включение содержимого файла заголовка дважды.

19.16

Директивы предварительной обработки должны быть синтаксически значимыми, даже если исключены препроцессором.

19.17

Все #else, #elif и #endif директивы препроцессора должны находиться в том же файле, что и #if или #ifdef директива, с которой они связаны.

Стандартные библиотеки

ПравилоОписание
20.1

Зарезервированные идентификаторы, макросы и функции в стандартной библиотеке не должны быть определены, переопределены или неопределены.

20.2

Имена стандартных библиотечных макросов, объектов и функций не должны использоваться повторно.

20.4

Динамическое выделение памяти «куча» не должно использоваться.

20.5

Индикатор ошибки errno не должны использоваться.

20.6

Макрос offsetof, в библиотечных <stddef.h>, не должны использоваться.

20.7

The setjmp макрос и longjmp функция не должна использоваться.

20.8

Средства обработки сигналов <signal.h> не должны использоваться.

20.9

Библиотека ввода/вывода <stdio.h> не должны использоваться в производственном коде.

20.10

Библиотека функционирует atof, atoi и atoll из библиотечных <stdlib.h> не должны использоваться.

20.11

Библиотека функционирует abort, exit, getenv и system из библиотечных <stdlib.h> не должны использоваться.

20.12

Функции обработки времени библиотечных <time.h> не должны использоваться.

Правила

C:2012 MISRA

Стандартное окружение C

ПравилоОписание
1.1

Программа не должна содержать нарушений стандартного синтаксиса C и ограничений и не должна превышать пределов перевода реализации.

1.2

Языковые расширения не должны использоваться.

Неиспользованный код

ПравилоОписание
2.6

Функция не должна содержать неиспользованных объявлений меток.

2.7

В функциях не должно быть неиспользованных параметров.

Комментарии

ПравилоОписание
3.1

Последовательности символов /* и // не должны использоваться в рамках комментария.

3.2

Сращивание линий не должно использоваться в // комментарии.

Наборы символов и лексические соглашения

ПравилоОписание
4.1

Восьмиугольные и шестнадцатеричные выходные последовательности должны быть прекращены.

4.2

Триграфы не должны использоваться.

Идентификаторы

ПравилоОписание
5.2

Идентификаторы, объявленные в тех же возможностях и пространстве имен, должны быть различными.

5.3

Идентификатор, объявленный во внутренних возможностях, не должен скрывать идентификатор, объявленный во внешних возможностях.

5.4

Идентификаторы макросов должны быть различными.

5.5

Идентификаторы должны отличаться от макро- имен.

Типы

ПравилоОписание
6.1

Битовые поля должны быть объявлены только с соответствующим типом.

6.2

Однобитовые именованные битовые поля не должны иметь тип со знаком.

Литералы и константы

ПравилоОписание
7.1

Восьмиугольные константы не должны использоваться.

7.2

Суффикс «u» или «U» применяется ко всем целочисленным константам, которые представлены в беззнаковом типе.

7.3

Строчный символ «l» не должен использоваться в буквальном суффиксе.

7.4

Строковый литерал не должен назначаться объекту, если только тип объекта не является «указателем на сертифицированный char».

Декларации и определения

ПравилоОписание
8.1

Типы должны быть четко указаны.

8.2

Типы функций должны быть в форме прототипа с именованными параметрами.

8.4

Совместимое объявление должно быть видно, когда определен объект или функция с внешним редактированием.

8.5Внешний объект или функция объявляются один раз в одном и только в одном файле.
8.6Идентификатор с внешним редактированием должен иметь только одно внешнее определение.
8.8

The static спецификатор класса памяти должен использоваться во всех декларациях объектов и функций, имеющих внутреннее редактирование.

8.10

Встроенная функция должна быть объявлена с static класс памяти.

8.11

Когда массив с внешним редактированием объявлен, его размер должен быть явно задан.

8.12

В список перечислителя значение неявно заданной постоянной перечисления должно быть уникальным.

8.14

The restrict классификатор типа не должен использоваться.

Инициализация

ПравилоОписание
9.2

Инициализатор агрегата или объединения должен быть заключен в скобки.

9.3

Массивы не должны быть частично инициализированы.

9.4

Элемент объекта не должен быть инициализирован более одного раза.

9.5

Если для инициализации объекта массива используются назначенные инициализаторы, то размер массива должен задаваться явным образом.

Модель Essential Type

ПравилоОписание
10.1

Операнды не должны быть несоответствующего типа.

10.2

Выражения по существу типа символов не должны использоваться ненадлежащим образом в операциях сложения и вычитания.

10.3

Значение выражения не присваивается объекту с более узким существенным типом или другой категории существенного типа.

10.4

Оба операнда оператора, в которых выполняются обычные арифметические преобразования, должны иметь одну и ту же категорию основных типов.

10.5

Значение выражения не должно быть приведено к неподходящему существенному типу.

10.6

Значение составного выражения не присваивается объекту с более широким существенным типом.

10.7

Если составное выражение используется в качестве одного операнда оператора, в котором выполняются обычные арифметические преобразования, то другой операнд не должен иметь более широкого существенного типа.

10.8

Значение составного выражения не должно относиться к другой категории основных типов или к более широкому типу основных элементов.

Преобразование типа указателя

ПравилоОписание
11.1

Преобразование не должно выполняться между указателем на функцию и любым другим типом.

11.2

Преобразование не должно выполняться между указателем на неполный тип и любым другим типом.

11.3

Приведение не должно выполняться между указателем на тип объекта и указателем на другой тип объекта.

11.4

Преобразование не должно выполняться между указателем на объект и целым типом.

11.5

Преобразование не должно выполняться из указателя в пустой в указатель на объект.

11.6

Приведение не должно выполняться между указателем на пустоту и арифметическим типом.

11.7

Приведение не должно выполняться между указателем на объект и нецелочисленным арифметическим типом.

11.8

Отливка не должна удалять какую-либо несовпадающую или летучую проверку из типа, на который указывает указатель.

11.9

Макрос NULL является единственно разрешенной формой целого числа нулевого указателя.

Выражения

ПравилоОписание
12.1

Приоритет операторов в выражениях должен быть явным.

12.3

Оператор запятыми не должен использоваться.

12.4

Оценка постоянных выражений не должна приводить к беззнаковому целочисленному переносу.

Побочные эффекты

ПравилоОписание
13.3

Полное выражение, содержащее шаг (++) или сокращение (--) оператор не должен иметь других потенциальных побочных эффектов, кроме тех, которые вызваны оператором шага или уменьшения.

13.4

Результат оператора назначения не должен использоваться.

13.6

Операнд sizeof оператор не должен содержать никаких выражений, которые имеют потенциальные побочные эффекты.

Выражения оператора управления

ПравилоОписание
14.4

Управляющее выражение if оператор и управляющее выражение оператора итерации должны иметь по существу логический тип.

Управляйте потоком

ПравилоОписание
15.1

The goto оператор не должен использоваться.

15.2

The goto оператор должен перейти к метке, объявленной позже в той же функции.

15.3

Любая метка, на которую ссылается goto оператор должен быть объявлен в том же блоке или в любом блоке, заключающем в goto оператор.

15.4

Должно быть не более одного break или goto оператор используется для завершения любого оператора итерации.

15.5

Функция должна иметь одну точку выхода в конце

15.6

Тело итерации-оператора или селекции должно быть составным оператором.

15.7

Все if … else if конструкции должны быть завершены else оператор.

Операторы Switch

ПравилоОписание
16.1

Все switch операторы должны быть хорошо сформированы.

16.2

A switch метка должна использоваться только в том случае, если самый близкий составной оператор является телом switch оператор.

16.3

Безусловное break оператор прекращает действие каждый switch- пункт.

16.4

Каждый switch оператор должно иметь default метка.

16.5

A default метка должна отображаться как первая или последняя switch метка switch оператор.

16.6

Каждый switch оператор должно иметь не менее двух switch- положения.

16.7

A switch-экспрессия не должна иметь по существу логического типа.

Функции

ПравилоОписание
17.1

Область функций <starg.h> не должны использоваться.

17.3

Функция не должна объявляться неявно.

17.4

Все выходные пути из функции с не- void возвращаемый тип должен иметь явный оператор возврата с выражением.

17.6

Объявление параметра массива не должно содержать static ключевое слово между [ ].

17.7

Значение, возвращенное функцией, не имеющей void должен использоваться возвращаемый тип.

Указатели и массивы

ПравилоОписание
18.4

The +, -, += и -= операторы не должны применяться к выражению типа указателя.

18.5

Объявления должны содержать не более двух уровней вложенности указателей.

18.7

Гибкие представители массива не должны быть объявлены.

18.8

Типы массивов переменной длины не должны использоваться.

Перекрывающееся хранилище

ПравилоОписание
19.2

The union не следует использовать ключевое слово.

Директивы предварительной обработки

ПравилоОписание
20.1

#include директивам должны предшествовать только директивы предпроцессора или комментарии.

20.2

The ', ", или \ символы и /* или // последовательности символов не должны находиться в имени файла заголовка.

20.3

The #include за директивой следует последовательность < filename > или\« filename\».

20.4

Макрос не должен быть определен с таким же именем, как ключевое слово.

20.5

#undef не следует использовать.

20.6

Лексемы, которые выглядят как директива предварительной обработки, не должны происходить в макро- аргумент.

20.7

Выражения, вытекающие из расширения макро- параметры, заключаются в круглые скобки.

20.8

Управляющее выражение #if или #elif директива о предварительной обработке должна быть оценена как 0 или 1.

20.9

Все идентификаторы, используемые в управляющем выражении #if или #elif директивы предварительной обработки должны быть #defineдо оценки.

20.10

The # и ## операторы предпроцессора не должны использоваться.

20.11

Параметр макроса, непосредственно следующий за # оператор не должен немедленно сопровождаться ## оператор.

20.12

Параметр макроса, используемый в качестве операнда к # или ## операторы, которые сами подлежат дальнейшей замене макросами, должны использоваться только в качестве операнда этим операторам.

20.13

A линии, чья первая лексема # является действительной директивой предварительной обработки.

20.14

Все #else, #elif и #endif директивы препроцессора должны находиться в том же файле, что и #if, #ifdef или #ifndef директива, с которой они связаны.

Стандартные библиотеки

ПравилоОписание
21.1

#define и #undef не должен использоваться в зарезервированном идентификаторе или зарезервированном имени макроса.

21.2

Зарезервированный идентификатор или имя макроса не должны объявляться.

21.3

Функции выделения и отмены выделения памяти <stdlib.h> не должны использоваться.

21.4

Стандартный файл заголовка <setjmp.h> не должны использоваться.

21.5

Стандартный файл заголовка <signal.h> не должны использоваться.

21.6

Входные/выходные функции Стандартной библиотеки не должны использоваться.

21.7

The atof, atoi, atol, и atoll функции <stdlib.h> не должны использоваться.

21.8

Библиотека функционирует abort, exit, getenv и system от <stdlib.h> не должны использоваться.

21.9

Библиотека функционирует bsearch и qsort от <stdlib.h> не должны использоваться.

21.10

Функции «Стандартное время и дата библиотеки» не должны использоваться.

21.11

Стандартный файл заголовка <tgmath.h> не должны использоваться.

21.12

Особые функции обработки исключений <fenv.h> не следует использовать.

Правила MISRA C++ 2008

Языковые независимые проблемы

ПравилоОписание
0-1-7Значение, возвращаемое функцией, имеющей непустой тип возврата, который не является перегруженным оператором, всегда должно использоваться.
0-1-11Не должно быть неиспользованных параметров (именованных или безымянных) в не- виртуальных функциях.
0-1-12Не должно быть неиспользованных параметров (именованных или безымянных) в наборе параметров для виртуальной функции и всех функций, которые ее переопределяют.
0-2-1Объект не должен быть назначен перекрывающемуся объекту.

Общая информация

ПравилоОписание
1-0-1Весь код должен соответствовать стандарту ISO/IEC 14882:2003 «Стандарт C++ с техническим исправлением 1».

Лексические конвенции

ПравилоОписание
2-3-1Триграфы не должны использоваться.
2-5-1Диграфы не должны использоваться.
2-7-1Последовательность символов/* не должна использоваться в комментарии C-стиля.
2-10-1Различные идентификаторы должны быть типографски однозначными.
2-10-2Идентификаторы, объявленные во внутренних возможностях, не должны скрывать идентификатор, объявленный во внешних возможностях.
2-10-3Имя typedef (включая проверку, если она имеется) должно быть уникальным идентификатором.
2-10-4Имя класса, объединения или перечисления (включая проверку, если таковая имеется) должно быть уникальным идентификатором.
2-10-6Если идентификатор ссылается на тип, он также не должен относиться к объекту или функции в тех же возможностях.
2-13-1Должны использоваться только те эвакуационные последовательности, которые определены в стандарте ISO/IEC 14882:2003.
2-13-2Восьмеричные константы (кроме нуля) и восьмеричные выходные последовательности (кроме «\0 ») не должны использоваться.
2-13-3Суффикс «U» применяется ко всем восьмеричным или шестнадцатеричным целочисленным буквам беззнакового типа.
2-13-4Буквальные суффиксы должны быть верхними.
2-13-5Узкие и широкие строковые литералы не должны быть сцеплены.

Основные концепции

ПравилоОписание
3-1-1Можно включать любой заголовочный файл в несколько модули перевода, не нарушая правила единого определения.
3-1-2Функции не должны быть объявлены на блоке возможностей.
3-1-3Когда массив объявлен, его размер должен быть указан явно или определен неявно путем инициализации.
3-3-1Объекты или функции с внешним редактированием должны быть объявлены в заголовочном файле.
3-3-2Если функция имеет внутреннее редактирование, все повторные объявления должны включать в себя статический спецификатор класса памяти.
3-4-1Идентификатор, объявленный как объект или тип, должен быть определен в блоке, который минимизирует его видимость.
3-9-1Типы, используемые для объекта, типа возврата функции или параметра функции, должны быть идентичными token for-token во всех объявлениях и повторных объявлениях.
3-9-2Вместо базовых числовых типов следует использовать шрифты, указывающие на размер и сигнальность.
3-9-3Базовые битовые представления значений с плавающей точкой не должны использоваться.

Стандартные преобразования

ПравилоОписание
4-5-1Выражения с типом bool не должны использоваться как операнды для встроенных операторов, кроме оператора назначения =, логических операторов &, ||,!, операторов равенства = = и! =, унарного оператора и условного оператора.
4-5-2Выражения с типом enum не должны использоваться как операнды для создания в операторах, отличных от оператора индекса [], оператора присвоения =, операторов равенства = = и! =, унарного & оператора и реляционных операторов <, < =, >, > =.
4-5-3Выражения с типом (равнина) char и wchar_t не должны использоваться в качестве операндов к встроенным операторам кроме оператора назначения =, операторы равенства == и! =, и одноместное & оператор.

Выражения

ПравилоОписание
5-0-1Значение выражения должно быть тем же самым в любом порядке оценки, который позволяет стандарт.
5-0-2Ограниченная зависимость должна быть помещена в выражения в правилах приоритета оператора C++.
5-0-3Выражение cvalue не должно неявно преобразовываться в другой базовый тип.
5-0-4Неявное интегральное преобразование не должно изменять сигнальность базового типа.
5-0-5Не должно быть неявных преобразований с плавающим интегралом.
5-0-6Неявное интегральное преобразование или преобразование с плавающей точкой не должно уменьшать размер базового типа.
5-0-7Не должно быть явных плавающих-интегральных преобразований выражения cvalue.
5-0-8Явное интегральное преобразование или преобразование с плавающей точкой не должно увеличивать размер базового типа выражения cvalue.
5-0-9Явное интегральное преобразование не должно изменять сигнальность базового типа выражения cvalue.
5-0-10Если побитовые операторы ~ и < < применяются к операнду с базовым типом беззнакового char или беззнакового шорт, результат должен быть немедленно приведен к базовому типу операнда.
5-0-11Обычный тип char должен использоваться только для хранения и использования значений символов.
5-0-12подпись char и беззнаковый тип char должны использоваться только для хранения и использования числовых значений.
5-0-13Условие оператора if и условие оператора итерации должны иметь тип bool.
5-0-14Первый операнд условного оператора должен иметь тип bool.
5-0-15Индексация массива должна быть единственной формой арифметики указателя.
5-0-18>, > =, <, < = не применяется к объектам типа указателя, кроме тех случаев, когда они указывают на один и тот же массив.
5-0-19Объявление объектов должно содержать не более двух уровней опосредования указателя.
5-0-20Непостоянные операнды двоичному битовому оператору должны иметь тот же базовый тип.
5-0-21Битовые операторы должны применяться только к операндам неподписанного базового типа.
5-2-1Каждый операнд логического & & или || должен быть постфиксом - выражением.
5-2-2Указатель на виртуальный базовый класс должен быть приведен только к указателю на производный класс с помощью dynamic_cast.
5-2-3Приведения от базового класса к производному классу не должны выполняться на полиморфных типах.
5-2-4Отливки C-типа (кроме отливок с пустыми данными) и отливки функционального обозначения (кроме явных вызовов конструктора) не должны использоваться.
5-2-5Отливка не должна удалять из типа указателя или ссылки какую-либо несовпадающую или летучую проверку.
5-2-6Приведение не должно преобразовывать указатель в функцию в любой другой тип указателя, включая указатель на тип функции.
5-2-7Объект с типом указателя не должен преобразовываться в несвязанный тип указателя, прямо или косвенно.
5-2-8Объект с целым типом или указателем на тип void не должен преобразовываться в объект с типом указателя.
5-2-9Приведение не должно преобразовывать тип указателя в интегральный тип.
5-2-10Операторы шага (+ +) и декремента (--) не должны смешиваться с другими операторами в выражении.
5-2-11Оператор запятыми, & & оператор и оператор || не должны быть перегружены.
5-2-12Идентификатор с типом массива, переданный как аргумент функции, не должен распадаться на указатель.
5-3-1Каждый операнд! оператор, логический & & или логический || операторы должны иметь тип bool.
5-3-2Оператор унарного минуса не применяется к выражению, базовый тип которого не подписан.
5-3-3Унарный & оператор не должен быть перегружен.
5-3-4Оценка операнда оператору размера не должна содержать побочных эффектов.
5-8-1Операнд правой руки оператора сдвига должен находиться между нулем и на единицу меньше ширины в битах базового типа операнда левой руки.
5-14-1Операнд правой руки логического & & или || оператора не должен содержать побочных эффектов.
5-18-1Оператор запятыми не должен использоваться.
5-19-1Оценка постоянных беззнаковых целочисленных выражений не должна приводить к переносу.

Операторы

ПравилоОписание
6-2-1Операторы назначения не должны использоваться в подмножествах.
6-2-2Выражения с плавающей точкой не должны прямо или косвенно проверяться на равенство или неравенство.
6-2-3Перед предварительной обработкой нулевой оператор должно происходить только в линии само по себе; за ним может последовать комментарий при условии, что первый символ, следующий за оператором null, является символом белого пространства.
6-3-1Оператор, образующий тело переключателя, в то время как, сделать... в то время как или для оператора является составным оператором.
6-4-1За конструкцией if (условие) следует составной оператор. За другим ключевым словом следует либо составной оператор, либо другой оператор if.
6-4-2Все, если... иное, если конструкции должны быть прекращены в соответствии с пунктом об ином.
6-4-3Оператор switch должен быть хорошо сформированным оператором switch.
6-4-4Метка switch-label должна использоваться только в том случае, если наиболее близко заключенным составным оператором является тело оператора switch.
6-4-5Оператор безоговорочного переключения или пропуска прекращает действие каждого пункта о непустом переключателе.
6-4-6Конечным пунктом оператора switch является положение по умолчанию.
6-4-7Условие оператора switch не должно иметь типа bool.
6-4-8Каждый оператор switch должен иметь по крайней мере один пункт-случай.
6-5-1Цикл for должен содержать один контур-счетчик, который не должен иметь плавающего типа.
6-5-2Если счетчик цикла не изменяется -- или++, то в пределах условия счетчик цикла должен использоваться только в качестве операнда на < =, <, > или > =.
6-5-3Счетчик контура не должен изменяться в пределах условия или оператора.
6-5-4Счетчик цикла должен быть изменен одним из: --, + +, - = n или + = n; где n остается постоянным для длительности цикла.
6-5-5Переменная loop-control, отличная от счетчика loop-counter, не должна изменяться в рамках условия или выражения.
6-5-6Переменная loop-control, отличная от счетчика loop-counter, измененная в операторе, должна иметь тип bool.
6-6-1Любая метка, на которую ссылается оператор goto, должна быть объявлена в том же блоке или в блоке, содержащем оператор goto.
6-6-2Оператор goto должен перейти к метке, объявленной позже в том же теле функции.
6-6-3Оператор продолжения должен использоваться только в хорошо сформированном цикле for.
6-6-4Для любого оператора итерации должно быть не более одного оператора break или goto, используемого для завершения цикла.
6-6-5Функция должна иметь одну точку выхода в конце функции.

Декларации

ПравилоОписание
7-3-1Глобальное пространство имен должно содержать только основные объявления пространства имен и внешние объявления «C».
7-3-2Основной идентификатор не должен использоваться для функции, отличной от основной глобальной функции.
7-3-3В файлах заголовков не должно быть неназванных пространств имен.
7-3-4использование-директивы не должно использоваться.
7-3-5Несколько объявлений для идентификатора в том же пространстве имен не должны распространяться на объявление использования для этого идентификатора.
7-3-6using-directives и using-declarations (исключая возможности или возможности функций using-declarations) не должны использоваться в файлах заголовков.
7-4-2Инструкции ассемблера вводятся только с помощью объявления asm.
7-4-3Язык сборки должен быть инкапсулирован и изолирован.

Declarators

ПравилоОписание
8-0-1init-declator-list или member-declator-list должны состоять из одного init-declator или member-declator соответственно.
8-3-1Параметры в переопределяющей виртуальной функции должны либо использовать те же аргументы по умолчанию, что и функция, которую они переопределяют, либо не должны задавать какие-либо аргументы по умолчанию.
8-4-1Функции не должны определяться с помощью обозначения эллипсиса.
8-4-2Идентификаторы, используемые для параметров в повторном объявлении функции, должны быть идентичны идентификаторам в объявлении.
8-4-3Все выходные пути из функции с непустым типом возврата должны иметь явный оператор возврата с выражением.
8-4-4Идентификатор функции должен либо использоваться для вызова функции, либо ему должны предшествовать &.
8-5-2Скобки должны использоваться для указания и соответствия структуры в ненулевой инициализации массивов и структур.
8-5-3В списке перечислителей конструкция = не должна использоваться для явной инициализации представителей, отличных от первой, если только все элементы не инициализированы явным образом.

Классы

ПравилоОписание
9-3-1функции const представителя не должны возвращать неконстатные указатели или ссылки на классовые данные.
9-3-2Представители функции не должны возвращать неконстатные указатели в классовые данные.
9-5-1Объединения не должны использоваться.
9-6-2Битовые поля должны быть либо типа bool, либо явно беззнакового или подписанного интегрального типа.
9-6-3Битовые поля не должны иметь тип перечисления.
9-6-4Именованные битовые поля со знаком целого типа должны иметь длину более одного бита.

Производные классы

ПравилоОписание
10-1-1Классы не должны быть выведены из виртуальных основ.
10-1-2Базовый класс должен быть объявлен виртуальным, только если он используется в иерархии алмазов.
10-1-3Доступный базовый класс не должен быть как виртуальным, так и невирусным в одной иерархии.
10-2-1Все доступные имена сущностей в нескольких иерархиях наследования должны быть уникальными.
10-3-1Не должно быть более одного определения каждой виртуальной функции на каждом пути через иерархию наследования.
10-3-2Каждая переопределяющая виртуальная функция должна быть объявлена с помощью виртуального ключевого слова.
10-3-3Виртуальная функция должна быть переопределена только чистой виртуальной функцией, если она сама объявлена как чистая виртуальная.

Представитель доступом членов

ПравилоОписание
11-0-1Данные представителей в типах классов, отличных от POD, должны быть частными.

Специальные Представители функции

ПравилоОписание
12-1-1Динамический тип объекта не должен использоваться из тела его конструктора или деструктора.
12-1-2Все конструкторы класса должны явным образом вызвать конструктор для всех его непосредственных базовых классов и всех виртуальных базовых классов.
12-1-3Все конструкторы, вызываемые с одним аргументом основного типа, объявляются явными.
12-8-1Конструктор копирования должен инициализировать только свои базовые классы и нестатические представители класса, представителем которого он является.
12-8-2Оператор назначения копии должен быть объявлен защищенным или частным в абстрактном классе.

Шаблоны

ПравилоОписание
14-5-2Конструктор копирования должен быть объявлен, когда существует конструктор шаблона с одним параметром, который является типовым параметром.
14-5-3Оператор назначения копии объявляется при наличии оператора назначения шаблона с параметром, который является типовым параметром.
14-6-1В шаблоне класса с зависимой основой любое имя, которое может быть найдено в этой зависимой основе, должно упоминаться с использованием квалифицированного идентификатора или this- >.
14-6-2Функция, выбранная разрешением перегрузки, должна разрешаться до функции, объявленной ранее в модуле перевода.
14-7-3Все частичные и явные специализации для шаблона должны быть объявлены в том же файле, что и объявление их основного шаблона.
14-8-1Перегруженные шаблоны функций не должны быть явно специализированными.
14-8-2Жизнеспособный набор функций для вызова функций должен либо не содержать специализаций функций, либо содержать только специализации функций.

Обработка исключений

ПравилоОписание
15-0-2Объект исключения не должен иметь тип указателя.
15-0-3Управление не должно передаваться в блок try или catch с помощью goto или оператора switch.
15-1-2Значение NULL не должно передаваться явным образом.
15-1-3Пустой бросок (бросок;) должен использоваться только в составной оператора обработчика улавливания.
15-3-2Должен быть по крайней мере один обработчик исключений, чтобы поймать все необработанные исключения
15-3-3Обработчики реализации function-try-block конструктора класса или деструктора не должны ссылаться на нестатические представители из этого класса или его основ.
15-3-5Исключение типа класса должно всегда захватываться путем ссылки.
15-3-6Если несколько обработчиков предусмотрены в одном операторе try-catch или function-try-блоке для производного класса и некоторых или всех его основ, обработчики должны быть упорядочены до базового класса.
15-3-7Если в одном операторе try-catch или блоке function-try-block предусмотрено несколько обработчиков, то любой обработчик эллипсиса (catch-all) должен происходить последним.
15-5-1Деструктор классов не должен выходить за исключением.
15-5-2Если заявление функции включает спецификацию исключения, то функция должна быть способна выдавать только исключения указанного типа (типов).

Директивы предварительной обработки

ПравилоОписание
16-0-1# включить директивы в файл должны предшествовать только другие директивы предпроцессора или комментарии.
16-0-2Макросы должны быть только # define 'd или # undef' d в глобальном пространстве имен.
16-0-3# undef не должен использоваться.
16-0-4Функциональные макросы не должны быть определены.
16-0-5Аргументы в функциональный макрос не должны содержать лексемы, которые выглядят как директивы предварительной обработки.
16-0-6В определении функционального макроса каждый образец параметра должен быть заключен в круглые скобки, если он не используется в качестве операнда # или # #.
16-0-7 Неопределенные идентификаторы макросов не должны использоваться в директивах предпроцессора # if или # elif, за исключением операндов определенному оператору.
16-0-8Если лексема # появляется в качестве первой лексемы в линии, то за ним немедленная следует лексема предварительной обработки.
16-1-1Определенный оператор препроцессора должен использоваться только в одной из двух стандартных форм.
16-1-2Все директивы # else, # elif и # endif предпроцессора должны находиться в том же файле, что и директива # if или # ifdef, с которой они связаны.
16-2-1Предварительный процессор должен использоваться только для включения файлов и включать защитные элементы.
16-2-2Макросы C++ должны использоваться только для: включая защитные ограждения, определители типа или спецификаторы классов памяти.
16-2-3Необходимо предусмотреть охрану.
16-2-4Символы ', ",/* или//не должны присутствовать в имени файла заголовка.
16-2-5Символ\не должен находиться в имени файла заголовка.
16-2-6После директивы # include следует последовательность < filename > или «filename».
16-3-1В одном описании макроса должно быть не более одного вхождения операторов # или # определение
16-3-2Операторы # и # # не должны использоваться.
16-6-1Все виды применения директивы # pragma должны быть задокументированы.
17-0-1Зарезервированные идентификаторы, макросы и функции в стандартной библиотеке не должны быть определены, переопределены или неопределены.
17-0-2Имена стандартных библиотечных макросов и объектов не должны использоваться повторно.
17-0-5Макрос setjmp и функция longjmp не должны использоваться.

Библиотека языковой поддержки

ПравилоОписание
18-0-1Библиотека C не должна использоваться.
18-0-2Не должны использоваться библиотечные функции atof, atoi и atol из библиотеки < cstdlib >.
18-0-3Функции библиотеки abort, exit, getenv и система из библиотеки < cstdlib > не должны использоваться.
18-0-4Функции обработки времени библиотеки < ctime > не должны использоваться.
18-0-5Неограниченные функции библиотеки < cstring > не должны использоваться.
18-2-1Смещение макроса не должно использоваться.
18-4-1Динамическое выделение памяти «куча» не должно использоваться.
18-7-1Средства обработки сигналов < csignal > не должны использоваться.

Библиотека диагностики

ПравилоОписание
19-3-1Индикатор ошибки errno не должен использоваться.

Библиотека ввода/вывода

ПравилоОписание
27-0-1Библиотека ввода/вывода потока < cstdio > не должна использоваться.