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

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

Дефекты Polyspace Bug Finder

Статическое ЗУ

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

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

Ненадежный бросок указателя функции
(func_cast)

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

Ненадежный бросок указателя
(ptr_cast)

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

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

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

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

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

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

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

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

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

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

Неподходящая инициализация массивов
(improper_array_init)

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

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

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

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

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

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

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

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

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

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

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

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

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

Небезопасное преобразование между указателем и целым числом
(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)

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

Оператор присваивания базового класса, не названный
(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)

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

Возвратитесь из не указатель const на инкапсулированный элемент данных
(breaking_data_encapsulation)

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

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

Оператор присваивания копии не тестирует на самоприсвоение

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

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

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

Хорошая практика

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

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

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

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

Трудно закодированный buffer size
(hard_coded_buffer_size)

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

Трудно закодированный контур цикла
(hard_coded_loop_boundary)

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

Большой аргумент передачи значением
(pass_by_value)

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

Строка больше чем с одним оператором
(more_than_one_statement)

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

Недостающий пропуск случая переключателя
(missing_switch_break)

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

Недостающий сброс освобожденного указателя
(missing_freed_ptr_reset)

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

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

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

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

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

Расширения языка

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

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

2.2

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

2.3

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

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

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

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

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

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

Только те escape-последовательности, которые заданы в стандарте ISO C, должны использоваться.

4.2

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

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

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

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

Типы

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

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

6.2

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

6.3

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

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

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

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

Оператор 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

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

14.5

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

14.6

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

14.7

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

14.8

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

14.9

if (выражение) построение должен сопровождаться составным оператором. Ключевое слово else должно сопровождаться или составным оператором или другим оператором if.

14.10

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

Операторы switch

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

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

15.1

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

15.2

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

15.3

Итоговый пункт оператора switch должен быть пунктом default.

15.4

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

15.5

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

Функции

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

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

16.3

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

16.5

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

16.6

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

16.8

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

16.9

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

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

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

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

17.5

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

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

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

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

18.4

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

Предварительная обработка директив

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

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

19.2

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

19.3

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

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

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

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> не должны использоваться.

MISRA C: 2 012 правил

Стандарт C среда

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

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

1.2

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

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

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

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

2.7

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

Комментарии

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

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

3.2

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

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

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

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

4.2

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

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

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

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

5.3

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

5.4

Макро-идентификаторы должны быть отличными.

5.5

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

Типы

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

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

6.2

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

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

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

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

7.2

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

7.3

Символ нижнего регистра "l" не должен использоваться в литеральном суффиксе.

7.4

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

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

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

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

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.

Операторы switch

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

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

16.2

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

16.3

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

16.4

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

16.5

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

16.6

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

16.7

switch - выражение не должно иметь по существу булева типа.

Функции

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

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

17.3

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

17.4

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

17.6

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

17.7

Значение, возвращенное функцией, имеющей non-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 'd перед оценкой.

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++ 2 008 правил

Независимые от языка проблемы

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

Общий

ПравилоОписание
1-0-1Весь код должен соответствовать ISO/IEC 14882:2003 "Стандарт C++ Слияние Технического Исправления 1".

Лексические соглашения

ПравилоОписание
2-3-1Trigraphs не должен использоваться.
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Только те escape-последовательности, которые заданы в 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Типы, используемые для объекта, функционального типа возврата или параметра функции, должны быть лексемой для лексемы, идентичной во всех объявлениях и переобъявлениях.
3-9-2Определения типов, которые указывают на размер и со знаком, должны использоваться вместо основных числовых типов.
3-9-3Базовые битные представления значений с плавающей точкой не должны использоваться.

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

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

Выражения

ПравилоОписание
5-0-1Значение выражения должно быть тем же самым согласно любому порядку оценки, которую разрешает стандарт.
5-0-2Ограниченная зависимость должна быть помещена в правила приоритета оператора C++ в выражениях.
5-0-3cvalue выражение не должно быть неявно преобразовано в различный базовый тип.
5-0-4Неявное интегральное преобразование не должно изменять со знаком из базового типа.
5-0-5Не должно быть никаких неявных интегральных плаванием преобразований.
5-0-6Неявное интегральное или преобразование с плавающей точкой не должно уменьшать размер базового типа.
5-0-7Не должно быть никаких явных интегральных плаванием преобразований cvalue выражения.
5-0-8Явное интегральное или преобразование с плавающей точкой не должно увеличивать размер базового типа cvalue выражения.
5-0-9Явное интегральное преобразование не должно изменять со знаком из базового типа cvalue выражения.
5-0-10Если побитовые операторы ~ и <<будут применены к операнду с базовым типом символьного или короткого целого без знака без знака, результат должен быть сразу брошен к базовому типу операнда.
5-0-11Простой символьный тип должен только использоваться для устройства хранения данных и использования символьных значений.
5-0-12символ со знаком и символьный тип без знака должны только использоваться для устройства хранения данных и использования числовых значений.
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Бросок не должен удалять const или энергозависимую проверку от типа указателя или ссылки.
5-2-6Бросок не должен преобразовывать указатель на функцию ни к какому другому типу указателя, включая указатель на функциональный тип.
5-2-7Объект с типом указателя не должен быть преобразован в несвязанный тип указателя, ни один прямо или косвенно.
5-2-8Объект с целочисленным типом или указателем, чтобы освободить тип не должен быть преобразован в объект с типом указателя.
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Оценка операнда к sizeof оператору не должна содержать побочные эффекты.
5-8-1Правый операнд оператора сдвига должен находиться между нулем и меньше, чем ширина в битах базового типа левого операнда.
5-14-1Правый операнд логического && или || оператор не должен содержать побочные эффекты.
5-18-1Оператор запятой не должен использоваться.
5-19-1Оценка постоянных выражений беззнаковых целых чисел не должна вести, чтобы повториться.

Операторы

ПравилоОписание
6-2-1Операторы присваивания не должны использоваться в подвыражениях.
6-2-2Выражения с плавающей точкой не должны быть прямо или косвенно протестированы на равенство или неравенство.
6-2-3Перед предварительной обработкой пустой оператор должен только произойти на строке отдельно; это может сопровождаться комментарием, при условии, что первый символ после пустого оператора является белым - пробел.
6-3-1Оператор, формирующий тело переключателя, в то время как, делает..., в то время как или для оператора будет составной оператор.
6-4-1Если (условие) создают, буду сопровождаться составным оператором. Еще ключевое слово должно сопровождаться или составным оператором или другим оператором if.
6-4-2Все, если... еще, если построения должны быть отключены с выражением else.
6-4-3Оператор switch должен быть правильно построенным оператором switch.
6-4-4Метка переключателя должна только использоваться, когда наиболее тесно заключающий составной оператор будет телом оператора 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Контрольная переменная цикла кроме счетчика цикла не должна быть изменена в условии или выражении.
6-5-6Контрольная переменная цикла кроме счетчика цикла, который изменяется в операторе, должна иметь тип bool.
6-6-1Любая метка, на которую ссылается оператор перехода, должна быть объявлена в том же блоке, или в блоке, заключающем оператор перехода.
6-6-2Оператор перехода должен перейти к метке, объявленной позже в том же теле функции.
6-6-3Оператор continue должен только использоваться в правильно построенном цикле for.
6-6-4Для любого оператора цикла должен быть не больше, чем один оператор завершения, или оператор перехода использовал завершение цикла for.
6-6-5Функция должна иметь одну точку выхода в конце функции.

Объявления

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

Операторы объявления

ПравилоОписание
8-0-1Init-declarator-list или членский список оператора объявления должны состоять из одного init-оператора-объявления или членского оператора объявления соответственно.
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 не должны возвращать указатели неconst или ссылки на данные класса.
9-3-2Функции членства не должны возвращать указатели неconst на данные класса.
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В шаблоне класса с зависимой основой любое имя, которое может быть найдено в той зависимой основе, должно быть отнесено в использование квалифицированного ID или этого->.
14-6-2Функция, выбранная разрешением перегрузки, должна решить к функции, объявленной ранее в модуле перевода.
14-7-3Все частичные и явные специализации для шаблона должны быть объявлены в том же файле как объявление их первичного шаблона.
14-8-1Шаблоны перегруженной функции не должны быть явным образом специализированы.
14-8-2Жизнеспособный функциональный набор для вызова функции не должен или содержать функциональные специализации, или только содержать функциональные специализации.

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

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

Предварительная обработка директив

ПравилоОписание
16-0-1Директивам #include в файле должны только предшествовать другие директивы препроцессору или комментарии.
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 директива должна сопровождаться или <имя файла> или последовательность "имени файла".
16-3-1Должно быть самое большее одно вхождение # или ## операторов в одном макроопределении.
16-3-2# и ## операторы не должны использоваться.
16-6-1Все использование #pragma директивы должно быть зарегистрировано.
17-0-1Зарезервированные идентификаторы, макросы и функции в стандартной библиотеке не должны быть заданы, переопределены или не определены.
17-0-2Имена стандартных макросов библиотеки и объектов не должны быть снова использованы.
17-0-5setjmp макрос и функция longjmp не должны использоваться.

Вспомогательная библиотека языка

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

Диагностическая библиотека

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

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

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