MISRA C:2004 и MISRA AC AGC Правила кодирования

Поддерживаемые MISRA C:2004 и MISRA AC AGC Rules

В следующих таблицах перечислены MISRA C®: 2004 правила кодирования, которые Polyspace® поддерживается проверка правил кодирования. Подробная информация о том, как программное обеспечение проверяет отдельные правила и любые ограничения по объему проверки, приводится в колонке «Спецификация Polyspace».

Примечание

Проверка правил кодирования Polyspace:

  • Поддерживает MISRA-C:2004 техническое исправление 1 для правил 4.1, 5.1, 5.3, 6.1, 6.3, 7.1, 9.2, 10.5, 12.6, 13.5 и 15.0.

  • Проверяет правила, заданные в MISRA AC AGC Guidelines для применения MISRA-C:2004 в контексте автоматической генерации кода.

Программа сообщает о большинстве нарушений на фазе компиляции анализа. Однако программное обеспечение обнаруживает нарушения правил 9.1 (Non-initialized variable), 12.11 (одна из проверок переполнения) с помощью -scalar-overflows-checks signed-and-unsigned), 13.7 (мертвый код), 14.1 (мертвый код), 16.2 и 21.1 во время анализа кода и сообщает об этих нарушениях как об ошибках времени выполнения.

Примечание

Некоторые нарушения правил 13.7 и 14.1 сообщаются на фазе компиляции анализа.

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

Если вы ожидаете нарушения правил, но не видите его, проверьте «Стандартные нарушения кодирования не отображаются».

Список поддерживаемых правил кодирования

Окружение

N.MISRA® ОпределениеСообщения в файле отчетаРеализация Polyspace
1.1Весь код должен соответствовать ISO® 9899:1990 «Языки программирования - C», с поправками и исправлениями ISO/IEC 9899/COR1:1995, ISO/IEC 9899/AMD1:1995 и ISO/IEC 9899/COR2:1996.

Текстовое All code shall conform to ISO 9899:1990 Programming languages C, amended and corrected by ISO/IEC 9899/COR1:1995, ISO/IEC 9899/AMD1:1995, and ISO/IEC 9899/COR2:1996 предшествует каждому из следующих сообщений:

  • ANSI® C не разрешает использование "# include _ next '

  • ANSI C не разрешает использование макросов со списком аргументов переменных 

  • ANSI C не разрешает использование «# assert »

  • ANSI C не разрешает '# unassert '

  • ANSI C не позволяет проверять значения

  • ANSI C не разрешает использование '# ident'

  • ANSI C не разрешает использование '# sccs'

  • текст, следующий за '# else', нарушает стандарт ANSI.

  • текст, следующий за '# endif', нарушает стандарт ANSI.

  • текст, следующий за '# else' или '# endif', нарушает стандарт ANSI.

  • ANSI C90 запрещает использование типа 'long long int'.

  • ANSI C90 запрещает использование типа 'long double'.

  • ANSI C90 запрещает длинные длинные целочисленные константы.

  • Не следует использовать ключевое слово 'inline'.

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

  • Целочисленная константа не помещается в беззнаковой длинной int.

  • Целочисленная константа не помещается внутри длинного int.

  • Слишком много уровней вложенности # включает: N1. Предел равен N0.

  • Слишком много определений макросов: N1. Предел равен N0.

  • Слишком много уровней вложенности для потока управления: N1. Предел равен N0.

  • Слишком много констант перечисления: N1. Предел равен N0.

Все поддерживаемые расширения приводят к нарушению этого правила MISRA. Стандартные сообщения об ошибке компиляции не приводят к нарушению этого правила MISRA и остаются неизменными.

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

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
2.1Язык сборки должен быть инкапсулирован и изолирован.Язык сборки должен быть инкапсулирован и изолирован.

Никаких предупреждений, если код инкапсулирован в следующем:

  • asm функции или asm pragma

  • Макрос

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

Комментарии C++ обрабатываются как комментарии, но приводят к нарушению этого правила MISRA

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

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

Это нарушение правил также возникает, когда последовательность символов/* внутри комментария C++.

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

2.4Разделы кода не должны быть «закомментированы»Разделы кода не должны быть «закомментированы»

Чекер использует внутреннюю эвристику, чтобы обнаружить закомментированный код. Для образца такие символы, как #, ;, { или } указать комментарии, которые потенциально могут содержать код. Эти комментарии затем оцениваются по другим метрикам, чтобы определить вероятность маскировки кода как комментария. Для образца несколько последовательных слов без символа между ними уменьшают эту вероятность.

Шашка не помечает следующие комментарии, даже если они содержат код:

  • Комментарии Doxygen, начинающиеся с /** или /*!.

  • Комментарии, которые повторяют один и тот же символ несколько раз, например, символ = здесь:

    /* =====================================
     * A comment
     * =====================================*/

  • Комментарии к первой линии файла.

  • Комментарии, которые смешивают стиль C (/* */) и стиль C++ (//).

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

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

ПравилоОпределение MISRAСообщения в файле отчетаРеализация Polyspace
3.4

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

Все виды применения директивы # pragma должны быть задокументированы и разъяснены.Чтобы проверить это правило, вы должны перечислить прагмы, которые разрешены в исходных файлах, используя опцию Allowed pragmas (-allowed-pragmas). Если Polyspace находит прагму, не входящую в допустимый список прагмы, возникает нарушение.

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

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
4.1Должны использоваться только те эвакуационные последовательности, которые определены в стандарте ISO C.\ < символ > не является выходной последовательностью ISO C Должны использоваться только те выходные последовательности, которые определены в стандарте ISO C. 
4.2Триграфы не должны использоваться.Триграфы не должны использоваться.Триграфы обрабатываются и преобразуются в эквивалентный символ, но приводят к нарушению правила MISRA

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

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
5.1Идентификаторы (внутренние и внешние) не должны полагаться на значимость более 31 символаИдентификатор 'XX' не должен полагаться на значимость более 31 символа.

Проверяются все идентификаторы (глобальные, статические и локальные).

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

Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access).

5.2

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

  • Локальное объявление XX скрывает другой идентификатор.

  • Объявление параметра XX скрывает другой идентификатор.

Принимает, что правило 8.1 не нарушается.

5.3

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

{typedef name} «»% s «» не следует повторно использовать. (уже используется как {typedef name} в% s:% d)

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

5.4

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

{имя тега} «»% s «» не следует повторно использовать. (уже используется как {имя тега} в% s:% d)

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

Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access).

5.5

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

{статический идентификатор/имя параметра} «% s» не следует повторно использовать. (уже используется как {статический идентификатор/имя параметра} со статической продолжительностью хранения в% s:% d)

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

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

5.6

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

{представитель} «»% s «» не следует повторно использовать. (уже используется как {представитель} в% s:% d)

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

Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access).

5.7

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

{идентификатор} «»% s «» не должен использоваться повторно. (уже используется как {identifier} в% s:% d)

О нарушениях не сообщается, когда:

  • Различные функции имеют параметры с таким же именем

  • Различные функции имеют локальные переменные с таким же именем

  • Функция имеет локальную переменную, которая имеет то же имя что и параметр другой функции

Типы

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace

6.1

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

Только допустимые операторы на простых графиках: '=', '= =' или '! =', явные приведения к интегральным типам и '?' (для 2-го и 3-го операндов)

Предупреждение, когда обычный char используется с оператором, отличным от =, = =,! =, явное приведение к интегральным типам или как второй или третий операнд? оператор.

6.2

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

  • Значение простого типа char неявно преобразуется в беззнаковый char.

  • Значение типа signed char неявно преобразуется в обычный char.

  • Значение типа unsigned char неявно преобразуется в обычный char.

Предупреждение, если значение обычного типа char неявно преобразуется в значение типа signed char или беззнакового char.

6.3

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

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

В определении typedef предупреждение не приводится.

6.4

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

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

 

6.5

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

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

Нет предупреждений на анонимных входных битовых полях ширины 0 - расширен на все подписанные битовые поля размера < = 1 (если нарушено правило 6.4).

Константы

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
7.1Восьмеричные константы (кроме нуля) и восьмеричные выходные последовательности не должны использоваться.
  • Восьмеричные константы, отличные от нуля, и восьмеричные выходные последовательности не должны использоваться.

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

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

 

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

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
8.1

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

  • Функция XX не имеет полного прототипа, видимого при вызове.

  • Функция XX не имеет никакого прототипа, видимого при определении.

Прототип, видимый по вызову, должен быть завершен.

8.2

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

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

 
8.3Для каждого функционального параметра тип, указанный в декларации и определении, должен быть идентичным, а типы возврата должны также совпадать.Определение функции 'XX' несовместимо с ее объявлением.Принимает, что правило 8.1 не нарушается. Правило ограничено совместимыми типами. Можно отключить
8.4

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

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

  • Глобальное объявление функции 'XX' несовместимо с ее определением.

  • Глобальное объявление переменной 'XX' несовместимо с ее определением.

Нарушения этого правила могут быть сгенерированы во время фазы ссылки.

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access).

8.5

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

  • Объект 'XX' не должен быть определен в заголовочном файле.

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

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

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

  • Не имеют инициализаторов.

  • Не имеют спецификаторов классов памяти или имеют static спецификатор

8.6

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

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

Это правило сопоставлено с идентификатором ISO/IEC TS 17961 addrescape.

8.7Объекты должны быть определены в возможности, если они доступны только из одной функцииОбъект 'XX' должен быть объявлен в блок возможностей.Ограничены статическими объектами.
8.8Внешний объект или функция должны быть объявлены в одном файле и только в одном файлеФункция/Объект 'XX' имеет внешние объявления в нескольких файлах.

Ограничены явными объявлениями extern (предварительные определения игнорируются).

Polyspace считает, что переменные или функции объявлены extern в файле без заголовка нарушают это правило.

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access).

8.9

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

  • Процедура/Глобальная переменная XX умножение задано.

  • Запрещенные множественные предварительные определения для объекта XX

  • Глобальная переменная имеет несколько предварительных определений

  • Неопределенная глобальная переменная XX

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

На предопределенных символах предупреждения не появляются.

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access).

8.10

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

Функция/Переменная XX должна иметь внутреннее редактирование.

Принимает, что 8.1 не нарушается. Нет предупреждения, если использует 0.

Если ваш код не содержит main и вы используете такие опции, как Variables to initialize (-main-generator-writes-variables) со значением custom чтобы явным образом задать набор переменных для инициализации, средство проверки не помечает эти переменные. Проверка предполагает, что в реальном приложении файл, содержащий main необходимо инициализировать переменные в дополнение к любому файлу, который в данный момент использует их. Поэтому переменные должны использоваться в нескольких модулях преобразования.

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access).

8.11

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

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

 
8.12

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

Размер массива 'XX' должен быть явно указан.

 

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

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
9.1

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

 

Проверяется во время анализа кода.

Нарушения, отображаемые как Неинициализированные результаты переменной.

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам. В Code Prover также можно увидеть различие в результатах, основанную на вашем выборе для опции Verification level (-to). Смотрите раздел «Проверка на нарушения стандартов кодирования».

9.2

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

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

 
9.3

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

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

 

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

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
10.1

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

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

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

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

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

  • Неявное преобразование выражения базового типа XX в тип XX, который не является более широким целым типом с той же сигнальностью.

  • Неявное преобразование одного из двоичных операндов, базовыми типами которых являются XX и XX

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

  • Неявное преобразование двоичного левого операнда базового типа XX в XX, который не является целым типом.

  • Неявное преобразование двоичного операнда правой руки базового типа XX в XX, который не является более широким целым типом с той же сигнальностью или неявным преобразованием двоичного кода? операнд левой руки базового типа XX-XX, но это сложное выражение.

  • Неявное преобразование комплексного целочисленного выражения базового типа XX в XX.

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

  • Неявное преобразование непостоянного целочисленного выражения базового типа XX как аргумента функции, чей соответствующий тип параметра является XX.

Основа типов ANSI C (signed char, short, int, long) определяет, что T2 шире T1, если T2 находится справа от T1 или T2 = T1. Такая же интерпретация применяется и к беззнаковой версии базовых типов.

Выражение типа bool или enum имеет int как базовый тип.

Обычный char мог иметь подписанный или неподписанный базовый тип (в зависимости от целевого строения Polyspace или настройки опций).

Базовый тип простого выражения struct.bitfield является базовым типом, используемым в определении битового поля, ширина битового поля не лексемы в расчет и принимает, что для битового поля используются только подписанные | беззнаковые int (Правило 6.4).

О нарушениях не сообщается, когда:

  • Неявное преобразование является расширением типа, без изменения сигнальности, если целое число

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

Никаких нарушений не сообщалось, когда все следующие значения true:

  • Неявное преобразование применяется к постоянному выражению и является расширением типа с возможным изменением сигнальности, если целое число

  • Преобразование не изменяет представление постоянного значения или результата операции

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

Об операциях с указателями нарушений не сообщалось.

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

10.2

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

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

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

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

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

  • Неявное преобразование выражения из XX в XX, которое не является более широким плавающим типом.

  • Неявное преобразование двоичного кода? операнд правой руки от XX до XX, но это сложное выражение.

  • Неявное преобразование двоичного кода? операнд правой руки от XX до XX, который не является более широким плавающим типом или неявным преобразованием двоичного кода? операнд левой руки от XX до XX, но это сложное выражение.

  • Неявное преобразование комплексного плавающего выражения из XX в XX.

  • Неявное преобразование плавающего выражения XX типа в возврате функции, ожидаемый тип которого XX.

  • Неявное преобразование плавающего выражения XX типа как аргумента функции, чей соответствующий тип параметра является XX.

Основа типов ANSI C (с плавающей точкой, double) определяет, что T2 шире T1, если T2 находится справа от T1 или T2 = T1.

О нарушениях не сообщается, когда:

  • Неявное преобразование является расширением типа

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

10.3

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

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

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

    Например, в этом примере нарушение показано в первом назначении i но не второй. В первом присвоении составное выражение i+1 непосредственно приведен от подписанного к неподписанному типу. Во втором назначении составное выражение сначала приведено к тому же типу, а затем результат приведен к другому типу.

    typedef int int32_T;
    typedef unsigned char uint8_T; 
    ...
    ...
    int32_T i;
    i = (uint8_T)(i+1); /* Noncompliant */
    i = (uint8_T)((int32_T)(i+1));
     /* Compliant */

  • Основа типов ANSI C (signed char, short, int, long) определяет, что T1 уже, чем T2, если T2 находится справа от T1 или T1 = T2. Та же методология применяется и к беззнаковой версии базовых типов.

  • Выражение типа bool или enum имеет int как базовый тип.

  • Обычный char мог иметь подписанный или неподписанный базовый тип (в зависимости от целевого строения или настройки опции).

  • Базовый тип простого выражения struct.bitfield является базовым типом , используемым в определении битового поля, ширина битового поля не лексемы в расчет и принимает, что для битового поля используются только подписанные, беззнаковые int (Правило 6.4).

10.4

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

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

Основа типов ANSI C (с плавающей точкой, double) определяет, что T1 уже T2, если T2 находится справа от T1 или T2 = T1. 

10.5

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

Bitwize [<<|~] применяется к операнду базового типа [без знака char 'unsigned short], результат должен быть немедленно приведен к базовому типу.

 
10.6

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

Нет явного суффикса 'U для констант неподписанного типа.

 Предупреждение, когда тип, определенный из значения и основы (восьмеричный, десятичный или шестнадцатеричный), не подписан и суффикса нет u или U.

Для примера, когда размер int и long int типы данных - 32 бита, проверка правил кодирования сообщит о нарушении правила 10.6 для следующей линии:

int a = 2147483648;

Существует различие между десятичной и шестнадцатеричной константами при int и long int не совпадают по размеру.

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

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
11.1

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

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

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

Смещения или неявные преобразования из NULL или (void*)0 не предупреждать.

11.2

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

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

Существует также предупреждение о потере квалификатора

Это правило сопоставлено с идентификатором ISO/IEC TS 17961 alignconv.

11.3

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

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

Исключение при нулевой константе. Расширенный ко всем преобразованиям

Это правило сопоставлено с идентификатором ISO/IEC TS 17961 alignconv.

11.4

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

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

 
11.5

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

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

Расширенный ко всем преобразованиям

Выражения

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
12.1

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

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

 
12.2Значение выражения должно быть тем же самым в любом порядке оценки, который позволяет стандарт.
  • Значение 'sym' зависит от порядка оценки.

  • Значение летучего 'sym' зависит от порядка оценки из-за нескольких обращений.

Проверка правила 12.2 предполагает, что в выражениях, которые дают логические значения (правило 13.1), назначение не выполняется.

Выражение является простым выражением символов. i = i++; является нарушением, но tab[2] = tab[2]++; не является нарушением.

12.3

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

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

Нет предупреждений о летучих доступах

12.4

Операнд правой руки логического & & или || оператора не должен содержать побочных эффектов.

Операнд правой руки логического & & или || оператора не должен содержать побочных эффектов.

Нет предупреждений о летучих доступах

12.5

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

  • операнд логического & & не является первичным выражением

  • операнд логического || не является первичным выражением

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

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

Разрешено исключение для ассоциативно (a & & b & & c), (a || b || c).

12.6

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

  • Операнд логического оператора '!' должен быть эффективно логическим.

  • Левый операнд логического оператора «% s» должен быть фактически логическим.

  • Правый операнд логического оператора «% s» должен быть фактически логическим.

  • % s операнд «»% s «» фактически является логическим. Логический не должен использоваться как операнды операторам, отличным от '& &', '||', '!', '=', '= =', '! =' и '?:'.

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

Некоторые операторы могут возвращать логические выражения, например (var == 0).

Примите во внимание следующий код:

unsigned char flag;
if (!flag)

Проверка правил сообщает о нарушении правила 12.6:

Operand of '!' logical
operator should be 
effectively Boolean.
Операнд flag является не логическим, а unsigned char.

Чтобы соответствовать правилу 12.6, код должен быть переписан либо как

if (!( flag != 0))
или
if (flag == 0)

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

12.7

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

  • Оператор [~/Left Shift/Right shift/&] применяется к выражению, базовый тип которого подписан. 

  • Битовая ~ на операнде подписанного базового типа XX.

  • Побитовый [<<|>>] на левой руке подписанного базового типа XX.

  • Побитовый [& | ^] на двух операндах s

Базовый тип для целого числа подписан, когда:

  • он не имеет суффикса u или U

  • он достаточно мал, чтобы вписаться в число со знаком 64 бита

12.8

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

  • сумма сдвига отрицательная

  • сумма сдвига больше 64

  • Побитовый отсчет [< < > >] вне области значений [0.. X] (ширина базового типа XX левого операнда - 1).

Числа, которыми манипулируют в директивах предварительной обработки, имеют ширину 64 бита, так что допустимая область значений сдвигов находится между 0 и 63

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

12.9

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

  • Унарный - на операнде неподписанного базового типа XX.

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

Базовый тип для целого числа подписан, когда:

  • он не имеет суффикса u или U

  • он достаточно мал, чтобы вписаться в число со знаком 64 бита

12.10

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

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

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

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

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

Предупреждение, когда:

  • Указатель с плавающей точкой приведен как указатель на другой тип данных. Приведение указателя с плавающей точкой в качестве указателя на void не генерирует предупреждение.

  • Поплавок упакован с другим типом данных. Для примера:

    union {
     float f;
     int i;
    } …
    

12.13

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

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

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

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

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
13.1

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

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

 

13.2

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

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

На целочисленных константах предупреждение не выдается. Пример: if (2)

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

13.3Выражения с плавающей точкой не должны проверяться на равенство или неравенство.Выражения с плавающей точкой не должны проверяться на равенство или неравенство.Предупреждение о направлениях только тестов.
13.4Управляющее выражение оператора for не должно содержать никаких объектов плавающего типаУправляющее выражение оператора for не должно содержать никаких объектов плавающего типаЕсли for index является символом переменной, проверяется, что он не является символом с плавающей точкой.
13.5Три выражения оператора for касаются только управления циклом
  • 1-е выражение должно быть присвоением.

  • Неправильный тип для счетчика цикла (XX).

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

  • Второе выражение должно быть сравнением с счетчиком циклов (XX).

  • 3-е выражение должно быть присвоением счетчика цикла (XX).

  • 3-е выражение: назначенная переменная должна быть счетчиком цикла (XX).

  • Допускаются следующие виды циклов:

    (а) все три выражения присутствуют;

    (b) 2-е и 3-е выражения должны присутствовать при предварительной инициализации счетчика цикла;

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

Проверяется, является ли индекс цикла for (V) символом переменной; проверяется, является ли V последней назначенной переменной в первом выражении (если оно присутствует). Проверяется, является ли в первом выражении, если оно присутствует, присвоением V; проверяется, должно ли во втором выражении, если оно присутствует, быть сравнение V; Проверяется, если в 3-м выражении, если оно присутствует, должно быть присвоение V.
13.6Числовые переменные, используемые в цикле for для подсчета итерации, не должны изменяться в теле цикла.Числовые переменные, используемые в цикле for для подсчета итерации, не должны изменяться в теле цикла.Обнаруживать только прямые назначения, если известен индекс цикла for и является ли он символом переменной.
13.7

Логические операции, результаты которых инвариантны, не допускаются

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

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

  • Логические операции, результаты которых инвариантны, не допускаются.

Во время компиляции проверяйте сравнения по крайней мере с одним постоянным операндом.

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

  • Bug Finder помечает некоторые нарушения этого правила через Dead code и Useless if шашки.

  • Code Prover не использует серый код для разметки нарушений этого правила.

В Code Prover также можно увидеть различие в результатах, основанную на вашем выборе для опции Verification level (-to). Смотрите проверку на нарушения стандартов кодирования..

Нарушение правил появляется при проверке, является ли enum значение переменных находится между его нижней и верхней границами. Нарушение появляется, даже если вы увеличиваете или уменьшаете переменную за ее пределами, например, в этом for условие цикла:

enum ec {RED, BLUE, GREEN} 
    col;
for(col=RED; col<=GREEN; 
    col++)
{}
Система координат enum переменная может потенциально обернуться, когда приращение выходит за пределы ее области значений, и условие цикла может всегда быть верным. Чтобы избежать нарушения правила, можно привести перечисление к целому числу перед сравнением, например:
enum ec {RED, BLUE, GREEN} 
   col;
for(col=RED; (int)col<=GREEN;
    col++ )
{}

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

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
14.1

Не должно быть недостижимого кода.

Не должно быть недостижимого кода.

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

14.2

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

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

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

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

 
14.3

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

Оператор null должен находиться в линии сам по себе

Мы предполагаем, что ';' является пустым оператором, когда он является первым символом на линию (исключая комментарии). Правило нарушается, когда:

  • перед ним есть некоторые комментарии к той же линии.

  • есть комментарий сразу после него

  • в той же линии есть что-то другое, чем комментарий после ';'.

14.4

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

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

 
14.5

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

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

 
14.6

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

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

 
14.7

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

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

 
14.8

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

  • Текст оператора do while должен быть составным оператором.

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

  • Тело оператора switch должно быть составным оператором

 
14.9

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

  • За конструкцией if (выражение) следует составной оператор.

  • За другим ключевым словом следует либо составной оператор, либо другой оператор if

 
14.10

Все, если еще конструкции должны содержать предложение final else.

Все, если еще конструкции должны содержать предложение final else.

 

Операторы Switch

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
15.0

Должен использоваться синтаксис коммутатора MISRA C.

синтаксические нормативные ограничения операторов switch.

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

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

В следующем примере правило отображается в файле журнала в линии 3:

1 ...
2 switch(index) {
3  var = var + 1; 
// RULE 15.0 
// violated
4case 1: ...

Код между оператором switch и первым случаем проверяется Polyspace как мертвый код. Оно соответствует стандартному поведению ANSI.

Это правило не рассматривается как обязательное правило в правилах C:2004 MISRA для сгенерированного кода. В сгенерированном коде, если вы находите нарушение правила 15.0, которое не нарушает одновременно более позднее правило в этой группе, обосновывайте нарушение соответствующими комментариями.

15.1

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

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

 
15.2

Оператор безоговорочного пропуска прекращает действие каждого пункта о непустом переключателе

Оператор безоговорочного пропуска прекращает действие каждого пункта о непустом переключателе

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

15.3

Конечным пунктом оператора switch является пункт по умолчанию

Конечным пунктом оператора switch является пункт по умолчанию

 
15.4

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

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

Использование опции -boolean-types может увеличить количество сгенерированных предупреждений.

15.5

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

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

 

Функции

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
16.1

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

Функция XX не должна быть определена как varargs.

 
16.2

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

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

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

Общее количество циклов рекурсии можно вычислить с помощью метрики сложности кода Number of Recursions.

16.3

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

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

Принимает, что правило 8.6 не нарушено.

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

Принимает, что правила 8.8, 8.1 и 16.3 не нарушаются.

Все вхождения обнаружены.

16.5

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

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

Также проверяются определения.

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

  • Недостаточно аргументов для XX.

Принимает, что правило 8.1 не нарушается.

Это правило сопоставлено с идентификатором ISO/IEC TS 17961 argcomp.

16.7

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

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

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

16.8

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

Отсутствующее возвращаемое значение для непустой функции XX.

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

16.9

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

Идентификатору функции XX должен предшествовать & или последующий список параметров.

 
16.10

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

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

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

Шашка не помечает функции memcpy, memset, memmove, strcpy, strncpy, strcat, strncat потому что эти функции просто возвращают указатель на свои первые аргументы.

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

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
17.1

Арифметика указателя применяется только к указателям, которые адресованы элементу массива или массива.

Арифметика указателя применяется только к указателям, которые адресованы элементу массива или массива.

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

>, > =, <, < = не применяется к типам указателей, кроме тех случаев, когда они указывают на один и тот же массив.

>, > =, <, < = не применяется к типам указателей, кроме тех случаев, когда они указывают на один и тот же массив.

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

Предупреждение о:

  • Операции с указателями. (p+I, I+p, и p-I, где p является указателем и I целое число).

  • Индексация массивов по немассовым указателям.

17.5Тип не должен содержать более 2 уровней опосредования указателяТип не должен содержать более 2 уровней опосредования указателя 
17.6Адрес объекта с автоматическим хранением не должен быть присвоен объекту, который может сохраняться после прекращения существования объекта.Указатель на параметр является недопустимым возвращаемым значением. Указатель на локальное значение является недопустимым возвращаемым значением.

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

Это правило сопоставлено с идентификатором ISO/IEC TS 17961 accfree.

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

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
18.1

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

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

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

18.2

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

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

  • Адрес назначения и источник XX перекрытия, поведение не определено.

 
18.4

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

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

 

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

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
19.1

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

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

Сообщение отображается, когда директиве # include предшествуют другие вещи, чем директивы препроцессора, комментарии, пространства или «новые линии».

19.2

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

  • Сообщение отображается на символах '"или/* между < и > в # include < имя файла >

  • Сообщение отображается на символах 'или/* между "и" в # include "именем файла

 
19.3

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

  • '# include' ожидает «FILENAME» или < FILENAME >

  • '# include _ next' ожидает «FILENAME» или < FILENAME >

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

Макрос «» < имя > «» не расширяется на совместимую конструкцию.

Мы предполагаем, что определение макроса не нарушает это правило, когда оно расширяется на:

  • скрепленная конструкция (не обязательно инициализатор)

  • скобочная конструкция (не обязательно выражение)

  • число

  • a символа константа

  • строковая константа (может быть результатом конкатенации аргументов строкового поля и буквальных строк)

  • следующие ключевые слова: typedef, extern, static, auto, register, const, volatile, __ asm __ и __ inline __

  • конструкцию нуль

19.5

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

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

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

 
19.6

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

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

 
19.7

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

Функция должна использоваться в выборе функции like-macroСообщение обо всех функциональных определениях макросов.
19.8

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

  • аргументы для макроса «» < имя >

  • макрос «» < имя > «» используется без аргументов.

  • макрос «» < имя > «», используемый всего с одним arg.

  • макрос «» < имя > «» используется с слишком большим количеством аргументов (< число >).

 
19.9

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

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

Это правило обнаруживается как нарушенное, когда символ '#' появляется в аргументе макроса (вне строковой или символьной константы)

19.10

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

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

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

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

19.11

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

'< имя >' не определено.

 
19.12

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

Несколько вхождения операторов предварительной обработки # или # #.

 
19.13

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

Сообщение об определениях макросов, использующих операторы # или # #

 
19.14

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

'defined' без идентификатора.

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

Когда заголовочный файл форматирован как,

#ifndef <control macro>
#define <control macro> 
<contents> #endif

или,

#ifndef <control macro>
#error ...
#else 
#define <control macro> 
<contents> #endif

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

19.16

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

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

 
19.17

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

  • '# elif' не в пределах условного.

  • '# else' не в пределах условного.

  • '# elif' не в пределах условного.

  • '# endif' не входит в условный.

  • несбалансированный '# endif '.

  • неотключенный '# if' условный.

  • неотключенный '# ifdef' условный.

  • неотключенный '# ifndef' условный.

 

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

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
20.1

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

  • Невозможно переопределить макрос «» < имя > «».

  • Макрос '< имя > не должен быть неопределенным.

 
20.2

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

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

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

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

  • Не имеют инициализаторов.

  • Не имеют спецификаторов классов памяти или имеют static спецификатор

20.3

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

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

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

  • Аргумент является локальной переменной

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

  • Функция библиотеки является общей математической функцией

  • Соответствующий параметр функции библиотеки имеет ограниченную входную область.

Функция библиотеки может быть одной из следующих: sqrt, tan, pow, log, log10, fmod, acos, asin, acosh, atanh, или atan2.

Bug Finder и Code Prover проверяют это правило по-разному. Анализ может привести к различным результатам.

20.4

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

  • Макрос '< name > не должен использоваться.

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

В случае, если динамические функции выделения памяти «куча» на самом деле являются макросами, и макрос расширен в коде, это правило обнаруживается как нарушенное. Принимает, что правило 20.2 не нарушено.

20.5

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

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

Принимает, что правило 20.2 не нарушается

20.6

Смещение макроса в библиотеке < stddef.h > не должно использоваться.

  • Макрос '< name > не должен использоваться.

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

Принимает, что правило 20.2 не нарушается

20.7

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

  • Макрос '< name > не должен использоваться.

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

В случае, если функция longjmp на самом деле является макросом, и макрос расширен в коде, это правило обнаруживается как нарушенное. Принимает, что правило 20.2 не нарушается

20.8

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

  • Макрос '< name > не должен использоваться.

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

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

20.9

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

  • Макрос '< name > не должен использоваться.

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

В случае, если функции библиотеки ввода/вывода являются фактически макросами и расширены в коде, это правило обнаруживается как нарушенное. Принимает, что правило 20.2 не нарушается

20.10

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

  • Макрос '< name > не должен использоваться.

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

В случае, если функции atof, atoi и atoll на самом деле являются макросами и расширяются, это правило обнаруживается как нарушенное. Принимает, что правило 20.2 не нарушается

20.11

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

  • Макрос '< name > не должен использоваться.

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

В случае, если прерывание, выход, getenv и системные функции на самом деле являются макросами и расширяются, это правило обнаруживается как нарушенное. Принимает, что правило 20.2 не нарушается

20.12

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

  • Макрос '< name > не должен использоваться.

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

В случае, если функции обработки времени фактически являются макросами и расширены, это правило определяется как нарушенное. Принимает, что правило 20.2 не нарушается

Отказы во время выполнения

N.Определение MISRAСообщения в файле отчетаРеализация Polyspace
21.1

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

  • статические средства/методы верификации;

  • динамические средства/методы верификации;

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

 

Сделано Polyspace. Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

В Code Prover также можно увидеть различие в результатах, основанную на вашем выборе для опции Verification level (-to). Смотрите проверку на нарушения стандартов кодирования..

Неподдерживаемые C:2004 MISRA и правила MISRA AC AGC

Проверка правил кодирования Polyspace не проверяет следующие правила C:2004 кодирования MISRA. Эти правила не могут быть применены, так как они находятся вне возможностей программного обеспечения Polyspace. Они могут касаться документации, динамических аспектов или функциональных аспектов правил MISRA. В столбце Дополнительная информация описывается причина, по которой каждое правило не проверяется.

Окружение

ПравилоОписаниеДополнительная информация
1.2 (Обязательно)

Не следует полагаться на неопределенное или неопределенное поведение

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

1.3 (Обязательно)

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

Это метод правила процесса.

1.4 (Обязательно)

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

Чтобы соблюдать это правило, проверьте документацию компилятора.

1.5 (Консультационный)

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

Чтобы соблюдать это правило, проверьте документацию компилятора.

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

ПравилоОписаниеДополнительная информация
3.1 (Обязательно)

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

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

3.2 (Обязательно)

Набор символов и соответствующая кодировка должны быть задокументированы.

Чтобы соблюдать это правило, проверьте документацию компилятора.

3.3 (Консультация)

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

Чтобы соблюдать это правило, проверьте документацию компилятора.

3.5 (Обязательно)

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

Чтобы соблюдать это правило, проверьте документацию компилятора.

3.6 (Обязательно)

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

Чтобы соблюдать это правило, проверьте документацию компилятора.

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

ПравилоОписаниеДополнительная информация
18.3 (Обязательно)

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

«назначение» - вопрос функционального проекта.