В следующих таблицах перечислены правила кодирования 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 по применению 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. | Текст
| Все поддерживаемые расширения приводят к нарушению этого правила MISRA. Стандартные сообщения об ошибках компиляции не приводят к нарушению этого правила MISRA и остаются неизменными. |
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 2.1 | Язык сборки должен быть инкапсулирован и изолирован. | Язык сборки должен быть инкапсулирован и изолирован. | Нет предупреждений, если код инкапсулирован в следующее:
|
| 2.2 | Исходный код должен использовать только/* */комментарии стиля | Комментарии C++ не используются. | Комментарии C++ обрабатываются как комментарии, но приводят к нарушению этого правила MISRA Примечание.Это правило не может быть аннотировано в исходном коде. |
| 2.3 | Последовательность символов/* не должна использоваться в комментарии | Последовательность символов/* не должна отображаться в комментарии. | Это нарушение правила также возникает, когда последовательность символов/* внутри комментария C++. Примечание.Это правило не может быть аннотировано в исходном коде. |
| 2.4 | Разделы кода не следует «комментировать» | Разделы кода не следует «комментировать» | Средство проверки использует внутреннюю эвристику для обнаружения комментированного кода. Например, такие символы, как Средство проверки не помечает следующие комментарии, даже если они содержат код:
Контролер считает, что эти замечания предназначены для целей документирования или введены намеренно с некоторой предубежденностью. |
| Правило | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 3.4 | Все виды использования директивы # pragma должны быть задокументированы и объяснены. | Все виды использования директивы # pragma должны быть задокументированы и объяснены. | Чтобы проверить это правило, необходимо перечислить прагматики, разрешенные в исходных файлах с помощью параметра Allowed pragmas (-allowed-pragmas). Если Polyspace находит прагматику, отсутствующую в списке разрешенных прагматик, возникает нарушение. |
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 4.1 | Должны использоваться только те спасательные последовательности, которые определены в стандарте ISO C. | \ < символ > не является escape-последовательностью ISO C Должны использоваться только те escape-последовательности, которые определены в стандарте ISO C. | |
| 4.2 | Триграфы не используются. | Триграфы не используются. | Триграфы обрабатываются и преобразуются в эквивалентный символ, но приводят к нарушению правила MISRA |
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 5.1 | Идентификаторы (внутренние и внешние) не должны основываться на значении более 31 символа | Идентификатор «XX» не должен зависеть от значения более 31 символа. | Проверяются все идентификаторы (глобальный, статический и локальный). Для упрощения проверки средство проверки правил показывает все идентификаторы, которые имеют те же первые 31 символ, что и одно нарушение правила. В истории событий нарушения этого правила можно просмотреть все экземпляры конфликтующих имен идентификаторов. Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access). |
5.2 | Идентификаторы во внутренней области не должны использовать то же имя, что и идентификатор во внешней области, и, следовательно, скрывать этот идентификатор. |
| Предполагает, что правило 8.1 не нарушается. |
5.3 | Имя typedef должно быть уникальным идентификатором | {typedef name} «% s» не следует использовать повторно. (уже используется как {typedef name} в% s:% d) | Предупреждение при повторном использовании имени typedef в качестве другого имени идентификатора. |
5.4 | Имя тега должно быть уникальным идентификатором | {tag name} «»% s «» не следует использовать повторно. (уже используется в качестве {tag name} в% s:% d) | Предупреждение при повторном использовании имени тега в качестве другого имени идентификатора Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access). |
5.5 | Не допускается повторное использование идентификатора объекта или функции со статической длительностью хранения. | {static identifier/parameter name} «% s» не следует использовать повторно. (уже используется как {static identifier/parameter name} со статической длительностью хранения в% s:% d) | Предупреждение при повторном использовании статического имени в качестве другого имени идентификатора Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. |
5.6 | Ни один идентификатор в одном пространстве имен не должен иметь ту же орфографию, что и идентификатор в другом пространстве имен, за исключением имен элементов структуры и объединения. | {имя члена} «»% s «» не следует использовать повторно. (уже используется как {имя члена} в% s:% d) | Предупреждение при Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access). |
5.7 | Имя идентификатора не должно использоваться повторно. | {Идентификатор} «»% s «» не следует использовать повторно. (уже используется как {идентификатор} в% s:% d) | О нарушении не сообщается, когда:
|
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
6.1 | Тип простого символа должен использоваться только для хранения и использования символьных значений | Допустимыми операторами на простых символах являются операторы «» = «», «» = = «» или «»! = «», явные слепки на интегральные типы и «»? (для 2-го и 3-го операндов) | Предупреждение, когда простой символ используется с оператором, отличным от =, =,! =, явных слепков к интегральным типам, или как второй или третий операнды? оператор. |
6.2 | Подписанный и неподписанный тип символа должен использоваться только для хранения и использования числовых значений. |
| Предупреждение, если значение типа plain char неявно преобразовано в значение типа signed char или unsigned char. |
6.3 | вместо основных типов следует использовать шрифты, указывающие на размер и заметность | вместо основных типов следует использовать типоразмеры, указывающие на размер и заметность. | В определении typedef предупреждение не дается. |
6.4 | Битовые поля должны быть определены только как неподписанные int или подписанные int. | Битовые поля должны быть определены только как неподписанные int или подписанные int. | |
6.5 | Битовые поля типа со знаком int должны иметь длину не менее 2 бит. | Битовые поля типа со знаком int должны иметь длину не менее 2 бит. | Нет предупреждения об анонимных битовых полях с подписью шириной 0 - распространяется на все битовые поля с подписью размером < = 1 (если нарушено правило 6.4). |
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 7.1 | Восьмеричные константы (отличные от нуля) и восьмеричные escape-последовательности не используются. |
|
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 8.1 | Функции должны иметь объявления прототипов, и прототипы должны быть видны как при определении функции, так и при вызове. |
| Прототип, видимый при вызове, должен быть завершен. |
| 8.2 | Каждый раз, когда объект или функция объявляется или определяется, ее тип должен быть явно указан. | Каждый раз, когда объект или функция объявляется или определяется, ее тип должен быть явно указан. | |
| 8.3 | Для каждого параметра функции тип, указанный в описании и определении, должен быть идентичным, а возвращаемые типы - идентичными. | Определение функции «XX» несовместимо с ее объявлением. | Предполагает, что правило 8.1 не нарушается. Правило ограничено совместимыми типами. Можно отключить |
| 8.4 | Если объекты или функции объявляются более одного раза, их типы должны быть совместимыми. |
| Нарушения этого правила могут генерироваться на этапе соединения. Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access). |
| 8.5 | В файле заголовка не должно быть определений объектов или функций |
| Предварительные определения рассматриваются как определения. Для объектов с областью действия файла предварительными определениями являются объявления, которые:
|
| 8.6 | Функции всегда должны быть объявлены в объеме файла. | Функция «» XX «» должна быть объявлена в области файла. | Это правило соответствует ISO/IEC TS 17961 ID
|
| 8.7 | Объекты должны быть определены в объеме блока, если доступ к ним осуществляется только из одной функции | Объект «» XX «» должен быть объявлен в области блока. | Ограничено статическими объектами. |
| 8.8 | Внешний объект или функция должны быть объявлены в одном файле и только в одном файле | Функция/объект «XX» имеет внешние объявления в нескольких файлах. | Ограничено явными внешними объявлениями (предварительные определения игнорируются). Polyspace считает, что переменные или функции объявлены Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access). |
| 8.9 | Идентификатор с внешней связью должен иметь ровно одно внешнее определение. |
| Средство проверки помечает несколько определений только в том случае, если они содержатся в разных файлах. На стандартных символах предупреждения не отображаются. Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access). |
| 8.10 | Все объявления и определения объектов или функций в объеме файла должны иметь внутреннюю связь, если не требуется внешняя связь | Функция/переменная XX должна иметь внутреннюю связь. | Предполагает, что 8.1 не нарушен. Нет предупреждения, если используется 0. Если код не содержит Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access). |
| 8.11 | Спецификатор статического класса хранения должен использоваться в определениях и объявлениях объектов и функций, имеющих внутреннюю связь | статический спецификатор класса хранения должен использоваться в символе XX внутренней связи. | |
| 8.12 | Когда массив объявлен с внешней связью, его размер должен быть указан явно или определен неявно при инициализации | Необходимо явно указать размер массива «» XX «». |
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 9.1 | Перед использованием всем автоматическим переменным должно быть присвоено значение. | Проверка во время анализа кода. Нарушения отображаются как неинициализированные результаты переменных. Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. В программе Code Prover можно также увидеть разницу в результатах на основе выбора опции. | |
| 9.2 | Фигурные скобки должны использоваться для указания и согласования структуры при ненулевой инициализации массивов и структур. | Фигурные скобки должны использоваться для указания и согласования структуры при ненулевой инициализации массивов и структур. | |
| 9.3 | В списке перечислителей конструкция = не должна использоваться для явной инициализации элементов, отличных от первого, если только все элементы не инициализированы явным образом. | В списке перечислителей конструкция = не должна использоваться для явной инициализации элементов, отличных от первого, если только все элементы не инициализированы явным образом. |
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 10.1 | Значение выражения целого типа не должно быть неявно преобразовано в другой базовый тип, если:
|
| Порядок базовых типов ANSI C (со знаком char, short, int, long) определяет, что T2 шире T1, если T2 находится справа от T1 или T2 = T1. Такая же интерпретация применяется к неподписанной версии базовых типов. Выражение типов bool или enum имеет int в качестве базового типа. Простой символ может иметь подписанный или неподписанный базовый тип (в зависимости от конфигурации или параметра цели Polyspace). Базовым типом простого выражения struct.bitfield является базовый тип, используемый в определении битового поля, ширина битового поля не является маркером и предполагает, что для битового поля используются только подписанные | неподписанные int (правило 6.4). О нарушении не сообщается, когда:
О нарушении не сообщается, если все следующие данные соответствуют действительности:
О нарушениях по операциям с указателями не сообщается. Преобразование констант не сообщается для этих случаев, чтобы избежать выделения слишком большого количества нарушений. Если константа может быть представлена как в исходном, так и в преобразованном типе, преобразование не является проблемой. |
| 10.2 | Значение выражения плавающего типа не должно быть неявно преобразовано в другой тип, если
|
| Порядок базовых типов ANSI C (float, double) определяет, что T2 шире T1, если T2 находится справа от T1 или T2 = T1. О нарушении не сообщается, когда:
|
| 10.3 | Значение комплексного выражения целочисленного типа может быть приведено только к типу, который является более узким и имеет ту же сигнатуру, что и базовый тип выражения. | Комплексное выражение базового типа XX может быть приведено только к более узкому целочисленному типу той же сигнатуры, однако типом назначения является XX. |
|
| 10.4 | Значение комплексного выражения типа float может быть приведено только к более узкому плавающему типу | Комплексное выражение типа XX может быть приведено только к более узкому плавающему типу, однако типом назначения является XX. | Порядок базовых типов ANSI C (float, double) определяет, что T1 уже T2, если T2 находится справа от T1 или T2 = T1. |
| 10.5 | Если побитовый оператор ~ и < < применяются к операнду нижележащего типа без знака или без знака, результат немедленно приводится к нижележащему типу операнда. | Побитовый [< < | ~] применяется к операнду нижележащего типа [неподписанный символ 'неподписанный короткий], результат немедленно приводится к нижележащему типу. | |
| 10.6 | Суффикс «U» применяется ко всем константам неподписанных типов | Нет явного суффикса «U» для констант неподписанного типа. | Предупреждение, если тип, определенный из значения и базы (восьмеричный, десятичный или шестнадцатеричный), не подписан и суффикс отсутствует Например, когда размер int a = 2147483648; Существует разница между десятичными и шестнадцатеричными константами, когда |
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 11.1 | Преобразование не должно выполняться между указателем на функцию и любым типом, отличным от интегрального типа | Преобразование не должно выполняться между указателем на функцию и любым типом, отличным от интегрального типа. | Приведение и неявные преобразования с использованием указателя функции. Толчки или неявные преобразования из |
| 11.2 | Преобразование не должно выполняться между указателем на объект и любым типом, отличным от интегрального типа, другим указателем на тип объекта или указателем на аннулирование | Преобразование не должно выполняться между указателем на объект и любым типом, отличным от интегрального типа, другим указателем на тип объекта или указателем на пустоту. | Также имеется предупреждение о потере квалификатора Это правило соответствует ISO/IEC TS 17961 ID
|
| 11.3 | Приведение не должно выполняться между типом указателя и интегральным типом | Приведение не должно выполняться между типом указателя и интегральным типом. | Исключение для нулевой константы. Распространяется на все преобразования Это правило соответствует ISO/IEC TS 17961 ID
|
| 11.4 | Приведение не должно выполняться между указателем на тип объекта и другим указателем на тип объекта. | Приведение не должно выполняться между указателем на тип объекта и другим указателем на тип объекта. | |
| 11.5 | Не должно выполняться приведение, которое устраняет любые противоречия или изменчивость квалификации из типа, адресуемого указателем | Не должно выполняться приведение, которое устраняет любые противоречия или изменчивость квалификации из типа, адресуемого указателем | Распространяется на все преобразования |
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 12.1 | Ограниченная зависимость от правил приоритета оператора C в выражениях | Ограниченная зависимость от правил приоритета оператора C в выражениях | |
| 12.2 | Значение выражения должно быть одинаковым при любом порядке оценки, разрешенном стандартом. |
| Проверка в правиле 12.2 предполагает, что в выражениях, дающих логические значения, назначение отсутствует (правило 13.1). Выражение является простым выражением символов. |
| 12.3 | | | Отсутствие предупреждения о нестабильных доступах |
| 12.4 | Операнд правой руки логического оператора & & или оператора | | не должен содержать побочных эффектов. | Операнд правой руки логического оператора & & или оператора | | не должен содержать побочных эффектов. | Отсутствие предупреждения о нестабильных доступах |
| 12.5 | Операнды логического & & или | | должны быть первичными выражениями. |
| Во время предварительной обработки нарушения этого правила обнаруживаются в выражениях в директивах # if. Разрешено исключение для ассоциативно (a & & b & & c), (a | | b | | c). |
| 12.6 | Операнды логических операторов (&, | | и!) должны быть логическими. Выражения, которые фактически являются логическими, не должны использоваться в качестве операндов для операторов, отличных от (&, | | или!). |
| Операнд логического оператора должен быть логическим типом данных. Хотя стандарт C явно не определяет логический тип данных, он неявно предполагает использование логического типа данных. Некоторые операторы могут возвращать логические выражения, например: Рассмотрим следующий код: 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) Использование опции |
| 12.7 | Побитовые операторы не должны применяться к операндам с подписью базового типа |
| Базовый тип для целого числа подписывается в следующих случаях:
|
| 12.8 | Операнд правой руки оператора сдвига должен лежать между нулем и единицей меньше ширины в битах нижележащего типа операнда левой руки. |
| Числа, которыми манипулируют в директивах предварительной обработки, имеют ширину 64 бита, так что допустимый диапазон сдвига находится в диапазоне от 0 до 63 Проверка также распространяется на битовые поля с шириной поля или шириной базового типа, когда он находится в пределах сложного выражения |
| 12.9 | Оператор «унарный минус» не применяется к выражению, базовый тип которого не подписан. |
| Базовый тип для целого числа подписывается в следующих случаях:
|
| 12.10 | Оператор запятой не используется. | Оператор запятой не используется. | |
| 12.11 | Оценка постоянного выражения без знака не должна приводить к обтеканию. | Оценка констант без знака целочисленных выражений не должна приводить к переносу. | |
| 12.12 | Базовые битовые представления значений с плавающей запятой не должны использоваться. | Базовые битовые представления значений с плавающей запятой не должны использоваться. | Предупреждение, когда:
|
| 12.13 | Операторы инкремента (+ +) и декремента (--) не должны смешиваться с другими операторами в выражении | Операторы инкремента (+ +) и декремента (--) не должны смешиваться с другими операторами в выражении | Предупреждение, когда операторы++ или -- используются не в одиночку. |
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 13.1 | Операторы назначения не должны использоваться в выражениях, дающих логические значения. | Операторы назначения не должны использоваться в выражениях, дающих логические значения. |
|
| 13.2 | Тесты значения против нуля должны быть явными, если операнд не является логическим | Тесты значения против нуля должны быть явными, если операнд не является логическим | Для целочисленных констант предупреждение не выдается. Пример: если (2) Использование опции |
| 13.3 | Выражения с плавающей запятой не должны проверяться на равенство или неравенство. | Выражения с плавающей запятой не должны проверяться на равенство или неравенство. | Предупреждение только для тестов. |
| 13.4 | Управляющее выражение оператора for не должно содержать объектов плавающего типа | Управляющее выражение оператора for не должно содержать объектов плавающего типа | Если индекс является символом переменной, убедитесь, что он не является плавающим. |
| 13.5 | Три выражения оператора for должны касаться только управления контуром |
| Проверяется, является ли индекс цикла for (V) символом переменной; проверено, является ли V последней назначенной переменной в первом выражении (если присутствует). Проверяется, является ли в первом выражении, если присутствует, присвоение V; проверено, если во втором выражении, если присутствует, должно быть сравнение V; Проверено, должно ли в 3-м выражении, если присутствует, быть присвоением V. |
| 13.6 | Числовые переменные, используемые в цикле for для подсчета итераций, не должны изменяться в теле цикла. | Числовые переменные, используемые в цикле for для подсчета итераций, не должны изменяться в теле цикла. | Обнаруживайте только прямые назначения, если известен индекс цикла for и если он является символом переменной. |
| 13.7 | Логические операции, результаты которых являются инвариантными, не допускаются |
| Во время компиляции проверьте сравнения хотя бы с одним постоянным операндом. Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.
В программе Code Prover можно также увидеть разницу в результатах на основе выбора опции. Нарушение правила появляется при проверке 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 | Не должно быть недостижимого кода. | Не должно быть недостижимого кода. | Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. |
| 14.2 | Все ненулевые операторы должны иметь, по крайней мере, один побочный эффект, независимо от того, как они выполнены, или вызывать изменение потока управления. | Все ненулевые операторы должны:
| |
| 14.3 | Перед предварительной обработкой оператор null должен находиться в строке сам по себе; за ним может следовать комментарий при условии, что первый символ, следующий за оператором null, является символом пробела. | Оператор NULL должен появиться в строке сам по себе | Предполагается, что оператор ';' является оператором null, если он является первым символом строки (исключая комментарии). Правило нарушается в следующих случаях:
|
| 14.4 | Оператор goto не используется. | Оператор goto не используется. | |
| 14.5 | Инструкция continue не используется. | Инструкция continue не используется. | |
| 14.6 | Для любого оператора итерации должен быть максимум один оператор разрыва, используемый для завершения цикла | Для любого оператора итерации должен быть максимум один оператор разрыва, используемый для завершения цикла | |
| 14.7 | Функция должна иметь единственную точку выхода в конце функции | Функция должна иметь единственную точку выхода в конце функции | |
| 14.8 | Заявление, формирующее корпус выключателя, в то время как, делает , в то время как или для заявления будет составное заявление |
| |
| 14.9 | За конструкцией if (выражение) следует составное выражение. За ключевым словом else следует либо составной оператор, либо другой оператор if |
| |
| 14.10 | All if else, если конструкции должны содержать заключительное предложение else. | All if else, если конструкции должны содержать заключительное предложение else. |
| 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 | Метку коммутатора следует использовать только в том случае, если наиболее близким составным оператором является тело оператора коммутатора. | Метку коммутатора следует использовать только в том случае, если наиболее близким составным оператором является тело оператора коммутатора. | |
| 15.2 | Заявление о безусловном разрыве прекращает действие каждого непустого пункта | Заявление о безусловном разрыве прекращает действие каждого непустого пункта | Предупреждение для каждого предложения о несоответствующем случае. |
| 15.3 | Последний пункт заявления о переключении должен быть пунктом по умолчанию | Последний пункт заявления о переключении должен быть пунктом по умолчанию | |
| 15.4 | Выражение switch не должно представлять значение, которое является логическим | Выражение switch не должно представлять значение, которое является логическим | Использование опции |
| 15.5 | В каждом операторе коммутатора должен быть хотя бы один пункт | В каждом операторе коммутатора должен быть хотя бы один пункт |
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 16.1 | Функции не должны определяться переменным числом аргументов. | Функция XX не должна быть определена как varargs. | |
| 16.2 | Функции не должны называть себя прямо или косвенно. | Функция% s не должна вызывать саму себя. | Средство проверки сообщает о каждой функции, вызывающей себя, прямо или косвенно. Даже если в одном цикле рекурсии задействовано несколько функций, каждая функция сообщается отдельно. Можно вычислить общее количество циклов рекурсии с помощью метрики сложности кода. |
| 16.3 | Идентификаторы должны быть даны для всех параметров в объявлении прототипа функции. | Идентификаторы должны быть даны для всех параметров в объявлении прототипа функции. | Предполагает, что правило 8.6 не нарушено. |
| 16.4 | Идентификаторы, используемые в объявлении и определении функции, должны быть идентичными. | Идентификаторы, используемые в объявлении и определении функции, должны быть идентичными. | Предполагает, что правила 8.8, 8.1 и 16.3 не нарушаются. Обнаружены все вхождения. |
| 16.5 | Функции без параметров объявляются с типом параметра void. | Функции без параметров объявляются с типом параметра void. | Также проверяются определения. |
| 16.6 | Количество аргументов, переданных функции, должно соответствовать количеству параметров. |
| Предполагает, что правило 8.1 не нарушается. Это правило соответствует ISO/IEC TS 17961 ID
|
| 16.7 | Параметр указателя в прототипе функции должен быть объявлен как указатель на | Параметр указателя в прототипе функции должен быть объявлен как указатель на | Предупреждение, если не - |
| 16.8 | Все пути выхода из функции с типом возврата non-void должны иметь явную инструкцию return с выражением. | Отсутствует возвращаемое значение для непустой функции XX. | Предупреждение, если функция, не являющаяся недействительной, не завершается безусловным возвратом с выражением. |
| 16.9 | Идентификатор функции должен использоваться только с предшествующим списком параметров или со списком параметров в скобках, который может быть пустым. | Идентификатору функции XX должен предшествовать & или следовать список параметров. | |
| 16.10 | Если функция возвращает информацию об ошибке, то эта информация об ошибке проверяется. | Если функция возвращает информацию об ошибке, то эта информация об ошибке проверяется. | Флажки средства проверки работают с функциями, не являющимися Средство проверки не помечает функции |
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 17.1 | Арифметика указателя применяется только к указателям, которые адресуют массив или элемент массива. | Арифметика указателя применяется только к указателям, которые адресуют массив или элемент массива. | |
| 17.2 | Вычитание указателя применяется только к указателям, которые адресуют элементы одного и того же массива | Вычитание указателя применяется только к указателям, которые адресуют элементы одного и того же массива. | |
| 17.3 | >, > =, <, < = не должны применяться к типам указателей, за исключением случаев, когда они указывают на один и тот же массив. | >, > =, <, < = не должны применяться к типам указателей, за исключением случаев, когда они указывают на один и тот же массив. | |
| 17.4 | Индексация массива должна быть единственной допустимой формой арифметики указателя. | Индексация массива должна быть единственной допустимой формой арифметики указателя. | Предупреждение на:
|
| 17.5 | Тип не должен содержать более 2 уровней косвенности указателя | Тип не должен содержать более 2 уровней косвенности указателя | |
| 17.6 | Адрес объекта с автоматическим хранением не должен присваиваться объекту, который может сохраняться после прекращения существования объекта. | Указатель на параметр является недопустимым возвращаемым значением. Указатель на локальное значение является недопустимым возвращаемым значением. | Предупреждение при назначении адреса глобальной переменной, возврате адреса локальной переменной или возврате адреса параметра. Это правило соответствует ISO/IEC TS 17961 ID
|
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 18.1 | Все типы структуры или объединения должны быть заполнены в конце единицы перевода. | Все типы структуры или объединения должны быть заполнены в конце единицы перевода. | Предупреждение для всех неполных описаний структур или союзов. |
| 18.2 | Объект не должен быть назначен перекрывающемуся объекту. |
| |
| 18.4 | Профсоюзы не должны использоваться | Профсоюзы не используются. |
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 19.1 | Операторы # include в файле должны предшествовать только директивам или комментариям других препроцессоров | Операторы # include в файле должны предшествовать только директивам или комментариям других препроцессоров | Сообщение отображается, когда директиве # 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 | В определении функционального макроса каждый экземпляр параметра должен быть заключен в круглые скобки, если он не используется в качестве операнда # или # #. | Экземпляр параметра должен быть заключен в круглые скобки. | Если Программа не генерирует предупреждение, если параметр повторно используется в качестве аргумента функции или функционального макроса. Например, рассмотрим параметр 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 | Все директивы # elf, # elif и # endif препроцессора должны находиться в том же файле, что и директива # if или # ifdef, с которой они связаны. |
|
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 20.1 | Зарезервированные идентификаторы, макросы и функции в стандартной библиотеке не должны быть определены, переопределены или не определены. |
| |
| 20.2 | Имена стандартных библиотечных макросов, объектов и функций не должны использоваться повторно. | Идентификатор XX не должен использоваться. | Если определен макрос, имя которого соответствует стандартному макросу библиотеки, объекту или функции, правило, обнаруженное как нарушенное, равно 20.1. Предварительные определения рассматриваются как определения. Для объектов с областью действия файла предварительными определениями являются объявления, которые:
|
| 20.3 | Проверяется достоверность значений, передаваемых библиотечным функциям. | Проверяется достоверность значений, передаваемых библиотечным функциям | Предупреждение для аргумента в вызове функции библиотеки, если все следующие значения истинны:
Библиотечная функция может быть одной из следующих: Поиск ошибок и проверка кода проверяют это правило по-разному. Анализ может дать различные результаты. |
| 20.4 | Динамическое выделение памяти кучи не должно использоваться. |
| Если динамические функции выделения памяти кучи фактически являются макросами и макрос расширяется в коде, это правило обнаруживается как нарушенное. Предполагает, что правило 20.2 не нарушается. |
| 20.5 | Индикатор ошибки errno не должен использоваться | Индикатор ошибки errno не должен использоваться | Предполагает, что правило 20.2 не нарушается |
| 20.6 | Смещение макросов в библиотеке < stddef.h > не используется. |
| Предполагает, что правило 20.2 не нарушается |
| 20.7 | Макрос setjmp и функция longjmp не должны использоваться. |
| Если функция longjmp фактически является макросом и макрос расширяется в коде, это правило обнаруживается как нарушенное. Предполагает, что правило 20.2 не нарушается |
| 20.8 | Средства обработки сигналов < signal.h > не используются. |
| В случае, если некоторые функции сигнала фактически являются макросами и расширены в коде, это правило обнаруживается как нарушенное. Предполагает, что правило 20.2 не нарушается |
| 20.9 | Библиотека ввода/вывода < stdio.h > не должна использоваться в производственном коде. |
| Если функции библиотеки ввода/вывода фактически являются макросами и развернуты в коде, это правило обнаруживается как нарушенное. Предполагает, что правило 20.2 не нарушается |
| 20.10 | Библиотечные функции atoi, atoi и atoll из библиотеки < stdlib.h > не используются. |
| Если функции atoi, atoi и atoll фактически являются макросами и развернуты, это правило обнаруживается как нарушенное. Предполагает, что правило 20.2 не нарушается |
| 20.11 | Функции библиотеки: прерывание, выход, getenv и система из библиотеки < stdlib.h > не должны использоваться. |
| Если функции abort, exit, getenv и system фактически являются макросами и развернуты, это правило обнаруживается как нарушенное. Предполагает, что правило 20.2 не нарушается |
| 20.12 | Функции обработки времени библиотеки < time.h > не используются. |
| Если функции обработки времени фактически являются макросами и развернуты, это правило обнаруживается как нарушенное. Предполагает, что правило 20.2 не нарушается |
| N. | Определение MISRA | Сообщения в файле отчета | Внедрение Polyspace |
|---|---|---|---|
| 21.1 | Минимизация отказов во время выполнения должна обеспечиваться использованием хотя бы одного из:
| Сделано Полиспейсом. Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. В программе Code Prover можно также увидеть разницу в результатах на основе выбора опции. |
Средство проверки правил кодирования Polyspace не проверяет следующие правила кодирования MISRA C:2004. Применение этих правил невозможно, так как они находятся вне области действия программного обеспечения Polyspace. Они могут касаться документации, динамических аспектов или функциональных аспектов правил MISRA. В столбце «Дополнительная информация» описывается причина, по которой каждое правило не проверяется.
| Правило | Описание | Дополнительная информация |
|---|---|---|
| 1.2 (Обязательно) | Не следует полагаться на неопределенное или неопределенное поведение | Статически не проверяется, если не учитываются динамические свойства данных |
| 1.3 (Обязательно) | Несколько компиляторов и/или языков должны использоваться только при наличии общего определенного стандарта интерфейса для объектного кода, которому соответствуют язык/компиляторы/ассемблеры. | Это метод правила процесса. |
| 1.4 (Обязательно) | Компилятор/компоновщик/идентификаторы (внутренние и внешние) не должны полагаться на значение более 31 символа. Кроме того, компилятор/компоновщик должен быть проверен, чтобы обеспечить поддержку значимости 31 символа и чувствительности к регистру для внешних идентификаторов. | Чтобы соблюдать это правило, проверьте документацию компилятора. |
| 1.5 (Консультационные услуги) | Реализации с плавающей запятой должны соответствовать определенному стандарту с плавающей запятой. | Чтобы соблюдать это правило, проверьте документацию компилятора. |
| Правило | Описание | Дополнительная информация |
|---|---|---|
| 3.1 (Обязательно) | Все виды использования поведения, определяемого реализацией, должны быть задокументированы. | Чтобы соблюдать это правило, проверьте документацию компилятора. Обнаружение ошибок основано на неопределенном поведении в соответствии с выбором, сделанным для реализационно определенных конструкций. |
| 3.2 (Обязательно) | Набор символов и соответствующая кодировка должны быть задокументированы. | Чтобы соблюдать это правило, проверьте документацию компилятора. |
| 3.3 (Консультативные услуги) | Реализация целочисленного деления в выбранном компиляторе должна определяться, документироваться и учитываться. | Чтобы соблюдать это правило, проверьте документацию компилятора. |
| 3.5 (Обязательно) | Определяемое реализацией поведение и упаковка битовых полей должны быть задокументированы, если на них полагаются. | Чтобы соблюдать это правило, проверьте документацию компилятора. |
| 3.6 (Обязательно) | Все библиотеки, используемые в производственном коде, должны быть написаны в соответствии с положениями настоящего документа и подлежать соответствующей проверке. | Чтобы соблюдать это правило, проверьте документацию компилятора. |
| Правило | Описание | Дополнительная информация |
|---|---|---|
| 18.3 (Обязательно) | Область памяти не должна использоваться повторно в несвязанных целях. | «Назначение» - функциональный вопрос конструкции. |