exponenta event banner

Результаты поиска ошибок обнаружены в режиме быстрого анализа

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

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

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

Дефекты поиска ошибок Polyspace

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

ИмяОписание
Переполнение буфера из неверного спецификатора формата строки
(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)

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

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

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

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

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

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

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

Перекрывающееся назначение
(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)

operator = метод не возвращает указатель на текущий объект

Оператор назначения базового класса не вызван
(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* указатель, указывающий на объект

Жестко закодированный размер буфера
(hard_coded_buffer_size)

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

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

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

Аргумент большого проходного значения
(pass_by_value)

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

Строка с несколькими инструкциями
(more_than_one_statement)

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

Отсутствует разрыв корпуса коммутатора
(missing_switch_break)

Нет комментариев в конце варианта переключения без оператора break

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

Свободный указатель не сопровождается инструкцией 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

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

6.2

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

6.3

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

6.4

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

6.5

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

Константы

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

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

Объявления и определения

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

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

8.2

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

8.3

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

8.5

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

8.6

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

8.7

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

8.8

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

8.9

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

8.11

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

8.12

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

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

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

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

9.3

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

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

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

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

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

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

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

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

10.2

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

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

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

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

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

10.3

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

10.4

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

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

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

12.3

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

Все операторы, отличные от NULL, должны либо

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

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

14.4

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

14.5

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

14.6

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

14.7

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

14.8

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

14.9

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

14.10

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

Операторы переключения

ПравилоОписание
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 возвращаемый тип должен иметь явную инструкцию return с выражением.

16.9

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

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

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

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

17.5

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

Структуры и союзы

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

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

18.4

Профсоюзы не используются.

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

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

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

19.2

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

19.3

#include за директивой должна следовать последовательность < имя _ файла > или «имя _ файла».

19.4

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

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

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

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

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

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

1.2

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

Неиспользуемый код

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

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

2.7

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

Комментарии

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

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

3.2

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

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

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

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

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

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

Объявления и определения

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

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

8.2

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

8.4

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

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

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

8.10

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

8.11

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

8.12

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

8.14

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

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

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

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

9.3

Не допускается частичная инициализация массивов.

9.4

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

9.5

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

Модель основного типа

ПравилоОписание
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

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

15.2

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

15.3

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

15.4

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

15.5

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

15.6

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

15.7

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

Операторы переключения

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

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

16.2

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

16.3

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

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 возвращаемый тип должен иметь явную инструкцию return с выражением.

17.6

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

17.7

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

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

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

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

18.5

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

18.7

Элементы гибкого массива не объявляются.

18.8

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

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

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

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

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

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

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

20.2

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

20.3

#include за директивой должна следовать последовательность < имя _ файла > или\« имя _ файла\».

20.4

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

20.5

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

20.6

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

20.7

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

20.8

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

20.9

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

20.10

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

20.11

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

20.12

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

20.13

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

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

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Имя типа (включая квалификацию, если она имеется) должно быть уникальным идентификатором.
2-10-4Название класса, объединения или перечисления (включая квалификацию, если таковая имеется) должно быть уникальным идентификатором.
2-10-6Если идентификатор относится к типу, он не должен также относиться к объекту или функции в той же области.
2-13-1Должны использоваться только те спасательные последовательности, которые определены в стандарте ISO/IEC 14882:2003.
2-13-2Восьмеричные константы (отличные от нуля) и восьмеричные escape-последовательности (отличные от «\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Выражения с перечислением типов не должны использоваться в качестве операндов для построения операторов, отличных от оператора подстрочного индекса [], оператора назначения =, операторов равенства = и! =, унарного & оператора и реляционных операторов <, < =, >, > =.
4-5-3Выражения с типом (равнина) случайная работа и 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Явное интегральное преобразование не должно изменять сигнатуру базового типа выражения значения.
5-0-10Если побитовые операторы ~ и < < применяются к операнду с нижележащим типом неподписанного символа или неподписанным коротким, результат должен быть немедленно приведен к нижележащему типу операнда.
5-0-11Тип простого символа должен использоваться только для хранения и использования символьных значений.
5-0-12подписанный символ и неподписанный символ должны использоваться только для хранения и использования числовых значений.
5-0-13Условие оператора if и условие оператора iteration должны иметь тип 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 должен выполняться только в строке самостоятельно; за ним может следовать комментарий при условии, что первый символ, следующий за оператором null, является символом пробела.
6-3-1Утверждение, образующее тело переключателя, в то время как, делать... в то время как или для оператора должно быть составным оператором.
6-4-1За конструкцией if (условие) следует составная инструкция. За ключевым словом else следует либо составной оператор, либо другой оператор if.
6-4-2Все, если... в противном случае, если конструкции должны быть прекращены пунктом else.
6-4-3Оператор переключения должен быть хорошо сформированным оператором переключения.
6-4-4Метка switch должна использоваться только в том случае, если самым близким составным оператором является тело оператора switch.
6-4-5Заявление о безусловном сбросе или разрыве прекращает действие каждого непустого пункта о переключении.
6-4-6Заключительным пунктом инструкции по переключению является пункт по умолчанию.
6-4-7Состояние оператора переключения не должно иметь тип bool.
6-4-8Каждый оператор переключения должен иметь по крайней мере один вариант.
6-5-1Контур для шлейфа должен содержать один счетчик шлейфа, который не должен иметь плавающего типа.
6-5-2Если счетчик цикла не изменяется на - или++, то в пределах условия счетчик цикла должен использоваться только в качестве операнда для < =, <, > или > =.
6-5-3Счетчик контуров не должен изменяться в пределах условия или инструкции.
6-5-4Счетчик контура должен быть изменен одним из: -, + +, - = n или + = n; где n остается постоянным в течение всего цикла.
6-5-5Переменная управления контуром, отличная от счетчика контуров, не должна изменяться в пределах условия или выражения.
6-5-6Переменная управления контуром, отличная от счетчика контуров, измененного в операторе, должна иметь тип bool.
6-6-1Любая метка, на которую ссылается оператор goto, должна быть объявлена в том же блоке или в блоке, включающем оператор goto.
6-6-2Оператор goto должен перейти к метке, объявленной позже в том же теле функции.
6-6-3Оператор continue должен использоваться только в хорошо сформированном цикле для.
6-6-4Для любого оператора итерации должно быть не более одного перерыва или оператора 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 (исключая scope scope или function scope using-declarations) не должны использоваться в файлах заголовков.
7-4-2Инструкции по сборке должны вводиться только с использованием асм-декларации.
7-4-3Язык сборки должен быть инкапсулирован и изолирован.

Declarators

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

Классы

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

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

ПравилоОписание
10-1-1Классы не должны быть производными от виртуальных баз.
10-1-2Базовый класс объявляется виртуальным только в том случае, если он используется в алмазной иерархии.
10-1-3Доступный базовый класс не должен быть одновременно виртуальным и невиртуальным в одной иерархии.
10-2-1Все доступные имена сущностей в иерархии множественного наследования должны быть уникальными.
10-3-1На каждом пути в иерархии наследования должно быть не более одного определения каждой виртуальной функции.
10-3-2Каждая переопределяющая виртуальная функция должна быть объявлена с помощью ключевого слова virtual.
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-block предусмотрено несколько обработчиков для производного класса и некоторых или всех его баз, обработчики упорядочиваются наиболее производными для базового класса.
15-3-7Если в одном операторе try-catch или function-try-block предусмотрено несколько обработчиков, любой обработчик многоточия (catch-all) должен быть последним.
15-5-1Деструктор класса не должен выходить за исключением.
15-5-2Если объявление функции включает в себя спецификацию исключения, функция должна быть способна создавать исключения только указанного типа (типов).

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

ПравилоОписание
16-0-1# include directions в файле должны предшествовать только другие директивы или комментарии препроцессора.
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Все директивы # elf, # elif и # endif препроцессора должны находиться в том же файле, что и директива # if или # ifdef, с которой они связаны.
16-2-1Препроцессор должен использоваться только для включения файлов и включать защитные устройства.
16-2-2Макросы C++ должны использоваться только для защиты, квалификаторов типа или спецификаторов класса хранения.
16-2-3Должны быть предусмотрены защитные устройства.
16-2-4Символы ', ",/* или//не должны присутствовать в имени файла заголовка.
16-2-5Символ\не должен присутствовать в имени файла заголовка.
16-2-6За директивой # include должна следовать последовательность < имя _ файла > или «имя _ файла».
16-3-1В одном определении макроса должно присутствовать не более одного вхождения операторов # или # #.
16-3-2Операторы # и # # не должны использоваться.
16-6-1Все виды использования директивы # pragma должны быть задокументированы.
17-0-1Зарезервированные идентификаторы, макросы и функции в стандартной библиотеке не должны быть определены, переопределены или не определены.
17-0-2Имена стандартных библиотечных макросов и объектов не должны использоваться повторно.
17-0-5Макрос setjmp и функция longjmp не должны использоваться.

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

ПравилоОписание
18-0-1Библиотека Си не должна использоваться.
18-0-2Библиотечные функции atoi, atoi и atol из библиотеки < cstdlib > не используются.
18-0-3Функции библиотеки прерывание, выход, 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 > не должна использоваться.