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

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

Программа предоставляет два предопределенных подмножества правил, которые она проверяет ранее в анализе. Подмножества доступны с опциями Check MISRA C:2004 (-misra2), Check MISRA AC AGC (-misra-ac-agc), и Check MISRA C:2012 (-misra3).

АргументЦель
single-unit-rules

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

Если вы обнаруживаете только нарушения правил кодирования и выбираете это подмножество, анализ Bug Finder останавливается после фазы компиляции.

system-decidable-rules

Проверяйте правила в single-unit-rules подмножество и некоторые правила, которые применяются к коллективному набору программных файлов. Дополнительные правила являются менее сложными правилами, которые применяются на уровне интегрирования. Эти правила можно проверить только на уровне интегрирования, поскольку правила включают в себя несколько модули перевода.

Если вы обнаруживаете только нарушения правил кодирования и выбираете это подмножество, анализ Bug Finder останавливается после фазы связывания.

Смотрите также «Проверка на нарушения правил кодирования».

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

Программа проверяет следующие правила в начале анализа. Правила, которые проверяются на уровень системы и появляются только в system-decidable-rules подмножество обозначено звездочкой.

Окружение

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

Весь код должен соответствовать ISO® 9899:1990 «Языки программирования - C», с поправками и исправлениями ISO/IEC 9899/COR1:1995, ISO/IEC 9899/AMD1:1995 и ISO/IEC 9899/COR2:1996.

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

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

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

2.2

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

2.3

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

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

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

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

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

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

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

4.2

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

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

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

Идентификаторы (внутренние и внешние) не должны полагаться на значимость более 31 символа.

5.2

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

5.3*

Имя typedef должно быть уникальным идентификатором.

5.4*

Имя тега должно быть уникальным идентификатором.

5.5*

Не следует повторно использовать идентификатор объекта или функции со статической длительностью хранения.

5.6*

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

5.7*

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

Типы

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

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

6.2

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

6.3

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

6.4

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

6.5

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

Константы

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

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

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

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

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

8.2

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

8.3

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

8.4*

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

8.5

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

8.6

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

8.7

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

8.8*

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

8.9*

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

8.10*

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

8.11

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

8.12

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

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

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

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

9.3

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

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

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

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

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

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

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

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

10.2

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

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

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

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

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

10.3

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

10.4

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

10.5

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

10.6

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

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

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

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

11.2

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

11.3

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

11.4

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

11.5

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

Выражения

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

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

12.3

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

12.5

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

12.6

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

12.7

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

12.9

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

12.10

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

12.11

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

12.12

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

12.13

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

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

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

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

13.2

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

13.3

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

13.4

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

13.5

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

13.6

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

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

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

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

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

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

14.4

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

14.5

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

14.6

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

14.7

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

14.8

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

14.9

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

14.10

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

Операторы Switch

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

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

15.1

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

15.2

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

15.3

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

15.4

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

15.5

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

Функции

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

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

16.3

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

16.4*

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

16.5

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

16.6

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

16.8

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

16.9

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

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

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

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

17.5

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

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

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

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

18.4

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

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

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

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

19.2

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

19.3

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

19.4

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

19.5

Макросы не должны быть #defined и #undefd внутри блока.

19.6

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

19.7

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

19.8

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

19.9

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

19.10

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

19.11

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

19.12

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

19.13

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

19.14

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

19.15

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

19.16

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

19.17

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

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

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

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

20.2

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

20.4

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

20.5

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

20.6

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

20.7

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

20.8

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

20.9

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

20.10

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

20.11

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

20.12

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

Правила, которые проверяются на уровень системы и появляются только в system-decidable-rules подмножество обозначено звездочкой.

Правила

C:2012 MISRA

Программа проверяет следующие правила в начале анализа. Правила, которые проверяются на уровень системы и появляются только в system-decidable-rules подмножество обозначено звездочкой.

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

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

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

1.2

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

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

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

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

2.4*

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

2.5*

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

2.6

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

2.7

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

Комментарии

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

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

3.2

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

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

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

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

4.2

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

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

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

Внешние идентификаторы должны быть отдельными.

5.2

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

5.3

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

5.4

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

5.5

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

5.6*

Имя typedef должно быть уникальным идентификатором.

5.7*

Имя тега должно быть уникальным идентификатором.

5.8*

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

5.9*

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

Типы

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

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

6.2

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

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

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

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

7.2

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

7.3

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

7.4

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

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

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

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

8.2

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

8.3*

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

8.4

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

8.5*

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

8.6*

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

8.7*

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

8.8

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

8.9*

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

8.10

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

8.11

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

8.12

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

8.14

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

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

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

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

9.3

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

9.4

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

9.5

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

Модель Essential Type

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

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

10.2

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

10.3

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

10.4

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

10.5

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

10.6

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

10.7

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

10.8

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

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

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

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

11.2

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

11.3

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

11.4

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

11.5

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

11.6

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

11.7

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

11.8

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

11.9

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

Выражения

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

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

12.3

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

12.4

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

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

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

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

13.4

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

13.6

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

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

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

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

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

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

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

15.2

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

15.3

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

15.4

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

15.5

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

15.6

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

15.7

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

Операторы Switch

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

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

16.2

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

16.3

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

16.4

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

16.5

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

16.6

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

16.7

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

Функции

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

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

17.3

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

17.4

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

17.6

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

17.7

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

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

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

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

18.5

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

18.7

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

18.8

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

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

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

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

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

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

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

20.2

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

20.3

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

20.4

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

20.5

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

20.6

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

20.7

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

20.8

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

20.9

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

20.10

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

20.11

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

20.12

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

20.13

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

20.14

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

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

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

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

21.2

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

21.3

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

21.4

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

21.5

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

21.6

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

21.7

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

21.8

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

21.9

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

21.10

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

21.11

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

21.12

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

Правила, которые проверяются на уровень системы и появляются только в system-decidable-rules подмножество обозначено звездочкой.

См. также

| |

Похожие темы