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

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

Следующие таблицы приводят 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.

  • Правила проверок заданы Инструкциями по AGC AC MISRA для Приложения 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 запрещает 'долгое длинное целое' тип.

  • ANSI C90 запрещает 'долго дважды' тип.

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

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

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

  • Целочисленная константа не соответствует в длинном целом без знака.

  • Целочисленная константа не соответствует в длинном целом.

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

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

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

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

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

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

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

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

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

  • Макросы

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

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

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

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

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

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

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

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

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

  • Доксиджен комментирует начало с /** или /*!.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Это средство проверки деактивировано в Polyspace по умолчанию как Вы Анализ кода. Смотрите Средства проверки, Деактивированные в Polyspace, когда Вы Кодируете Анализ По умолчанию (Polyspace Bug Finder Access).

5.2

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

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

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

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

5.3

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

{имя определения типа} '%s' не должно быть снова использовано. (уже используемый в качестве {имя определения типа} в %s: D

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

5.4

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

{имя тега} '%s' не должно быть снова использовано. (уже используемый в качестве {имени тега} в %s: D

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

Это средство проверки деактивировано в Polyspace по умолчанию как Вы Анализ кода. Смотрите Средства проверки, Деактивированные в Polyspace, когда Вы Кодируете Анализ По умолчанию (Polyspace Bug Finder Access).

5.5

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

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

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

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

5.6

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

{имя элемента} '%s' не должно быть снова использовано. (уже используемый в качестве {имени элемента} в %s: D

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

Это средство проверки деактивировано в Polyspace по умолчанию как Вы Анализ кода. Смотрите Средства проверки, Деактивированные в Polyspace, когда Вы Кодируете Анализ По умолчанию (Polyspace Bug Finder Access).

5.7

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

{идентификатор} '%s' не должен быть снова использован. (уже используемый в качестве {идентификатора} в %s: D

Никакое нарушение, о котором сообщают, когда:

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

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

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

Типы

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

6.1

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

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

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

6.2

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

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

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

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

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

6.3

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

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

Никакое предупреждение не дано в определении определения типа.

6.4

Битовые поля должны только быть заданы, чтобы иметь тип int без знака или подписанный int.

Битовые поля должны только быть заданы, чтобы иметь тип int без знака или подписанный int.

 

6.5

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

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

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

Константы

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

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

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

 

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

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

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

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

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

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

8.2

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

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

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

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

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

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

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

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

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

Это средство проверки деактивировано в Polyspace по умолчанию как Вы Анализ кода. Смотрите Средства проверки, Деактивированные в Polyspace, когда Вы Кодируете Анализ По умолчанию (Polyspace Bug Finder Access).

8.5

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

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

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

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

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

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

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

8.6

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

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

Это правило сопоставляет с ID ISO/IEC TS 17961 addrescape.

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

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

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

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

Это средство проверки деактивировано в Polyspace по умолчанию как Вы Анализ кода. Смотрите Средства проверки, Деактивированные в Polyspace, когда Вы Кодируете Анализ По умолчанию (Polyspace Bug Finder Access).

8.9

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

  • Процедура/щлобальная переменная XX умножается заданный.

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

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

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

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

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

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

Это средство проверки деактивировано в Polyspace по умолчанию как Вы Анализ кода. Смотрите Средства проверки, Деактивированные в Polyspace, когда Вы Кодируете Анализ По умолчанию (Polyspace Bug Finder Access).

8.10

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

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

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

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

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

Это средство проверки деактивировано в Polyspace по умолчанию как Вы Анализ кода. Смотрите Средства проверки, Деактивированные в Polyspace, когда Вы Кодируете Анализ По умолчанию (Polyspace Bug Finder Access).

8.11

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

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

 
8.12

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

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

 

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

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

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

 

Проверяемый во время анализа кода.

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

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

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 порядок базовых типов (символ со знаком, короткий, международный, долго), задает это, T2 более широк, чем T1, если T2 имеет справа T1 или T2 = T1. Та же интерпретация применяется на версию без знака базовых типов.

Выражение bool или перечислимых типов имеет int как лежащий в основе типа.

Простой char, возможно, подписался или базовый тип без знака (в зависимости от целевой настройки Polyspace или установки опции).

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

Никакое нарушение, о котором сообщают, когда:

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

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

Никакое нарушение не сообщило, когда следующее является всей истиной:

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

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

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

Никакое нарушение, о котором сообщают относительно операций включающие указатели.

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

10.2

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

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

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

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

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

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

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

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

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

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

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

ANSI C порядок базовых типов (плавание, дважды) задает это, 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 порядок базовых типов (символ со знаком, короткий, международный, долго), задает это, T1 является более узким, чем T2, если T2 имеет справа T1 или T1 = T2. Та же методология применяется на версию без знака базовых типов.

  • Выражение bool или перечислимых типов имеет int как лежащий в основе типа.

  • Простой char, возможно, подписался или базовый тип без знака (в зависимости от целевой настройки или установки опции).

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

10.4

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

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

ANSI C порядок базовых типов (плавание, дважды) задает это, T1 является более узким, чем T2, если T2 имеет справа T1 или T2 = T1. 

10.5

Если побитовый оператор ~ и <<будет применен к операнду базового типа символьное или короткое целое без знака без знака, то результат должен быть сразу брошен к базовому типу операнда

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

 
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

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

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

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

Это правило сопоставляет с ID ISO/IEC TS 17961 alignconv.

11.3

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

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

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

Это правило сопоставляет с ID ISO/IEC TS 17961 alignconv.

11.4

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

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

 
11.5

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

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

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

Выражения

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

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

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

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

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

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

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

12.3

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

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

Никакое предупреждение на энергозависимых доступах

12.4

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

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

Никакое предупреждение на энергозависимых доступах

12.5

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

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

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

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

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

Позволенное исключение на ассоциативно (&& b && c), (|| 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

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

  • [~ / Левый Сдвиг/Право 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

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

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

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

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

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

  • Плохо введите счетчик цикла for (XX).

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

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

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

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

  • Следующие виды циклов for позволены:

    (a) должны присутствовать все три выражения;

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

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

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

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

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

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

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

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

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

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

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

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

Нарушение правила появляется, когда вы проверяете ли 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 и Программа автоматического доказательства Кода проверяют это правило кодирования по-другому. Исследования могут привести к различным результатам.

14.2

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

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

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

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

 
14.3

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

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

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

  • существуют некоторые комментарии перед ним на той же линии.

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

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

14.4

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

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

 
14.5

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

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

 
14.6

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

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

 
14.7

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

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

 
14.8

Оператор, формирующий тело переключателя, в то время как, делает , в то время как или для оператора будет составной оператор

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

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

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

 
14.9

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

  • Если (выражение) создают, буду сопровождаться составным оператором.

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

 
14.10

Все, если еще, если построения должны содержать итоговое выражение else.

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

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

15.1

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

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

 
15.2

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

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

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

15.3

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

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

 
15.4

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

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

Использование опции -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

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

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

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

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

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

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

Это правило сопоставляет с ID ISO/IEC TS 17961 argcomp.

16.7

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

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

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

16.8

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

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

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

16.9

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

Функциональному идентификатору XX должен предшествовать a & или сопровождать список параметров.

 
16.10

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

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

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

Средство проверки не отмечает функции memcpy, memset, memmove, strcpy, strncpystrcat, 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Адрес объекта с автоматическим хранением не должен быть присвоен объекту, который может сохраниться после того, как объект прекратил существование.Указатель на параметр является недопустимым возвращаемым значением. Указатель на локальную переменную является недопустимым возвращаемым значением.

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

Это правило сопоставляет с ID 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 директива должна сопровождаться или <имя файла> или последовательность "имени файла".

  • '#include' ожидает "ИМЯ ФАЙЛА" или <ИМЯ ФАЙЛА>

  • '#include_next' ожидает "ИМЯ ФАЙЛА" или <ИМЯ ФАЙЛА>

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

Макрос' <имя>' не расширяется до совместимого построения.

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

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

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

  • номер

  • символьная константа

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

  • следующие ключевые слова: определение типа, экстерн, статический, автоматический, регистр, const, энергозависимый, __ asm __ и __, встраивают __

  • построение "делает в то время как нуль"

19.5

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

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

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

 
19.6

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

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

 
19.7

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

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

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

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

  • макрос' <имя>' используется без args.

  • макрос' <имя>', используемое со всего одним аргументом.

  • макрос' <имя>', используемое со слишком многими (<номер>) args.

 
19.9

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

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

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

19.10

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

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

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

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

19.11

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

'<имя>' не задано.

 
19.12

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

Больше чем одно вхождение # или ## операторов препроцессора.

 
19.13

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

Обменивайтесь сообщениями на определениях макросов с помощью # или ## операторы

 
19.14

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

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

 
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

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

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

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

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

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

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

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

Библиотечная функция может быть одним из следующего: sqrttan, powжурналlog10, fmodacosasinacoshatanh, или atan2.

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

20.4

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

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

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

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

20.5

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

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

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

20.6

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

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

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

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

20.7

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

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

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

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

20.8

Погрузочно-разгрузочное оборудование сигнала <signal.h> не должно использоваться.

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

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

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

20.9

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

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

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

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

20.10

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

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

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

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

20.11

Аварийное прекращение работы библиотечных функций, выход, getenv и система от библиотеки <stdlib.h> не должны использоваться.

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

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

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

20.12

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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 (Необходимый)

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

"целью" является проблема функционального проекта.