exponenta event banner

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

На начальном этапе компиляции анализа 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

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

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.4*

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

8.5

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

8.6

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

8.7

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

8.8*

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

8.9*

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

8.10*

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

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.4*

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

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

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

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

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

Правила C:2012 MISRA

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

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

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

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

1.2

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

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

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

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

2.4*

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

2.5*

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

2.6

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

2.7

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

Комментарии

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

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

3.2

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

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

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

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

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

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

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

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

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

8.2

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

8.3*

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

8.4

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

8.5*

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

8.6*

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

8.7*

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

8.8

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

8.9*

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

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

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

См. также

| |

Связанные темы