exponenta event banner

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

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

В следующих таблицах перечислены правила кодирования 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.

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

  • ANSI ® C не разрешает «# include _ next»

  • ANSI C не допускает макросы со списком переменных аргументов 

  • ANSI C не разрешает «# assert »

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

  • ANSI C не позволяет тестировать утверждения

  • ANSI C не допускает '# ident'

  • ANSI C не допускает '# sccs'

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

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

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

  • ANSI C90 запрещает тип «long long int».

  • ANSI C90 запрещает тип «длинный двойник».

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

  • Ключевое слово «» inline «» не должно использоваться.

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

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

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

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

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

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

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

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

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

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

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

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

  • Макрос

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Комментарии, сочетающие стиль C (/* */) и стиль C++ (//).

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

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

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

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

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

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

N.Определение MISRAСообщения в файле отчетаВнедрение Polyspace
4.1Должны использоваться только те спасательные последовательности, которые определены в стандарте ISO C.\ < символ > не является 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

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

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

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

Предполагает, что правило 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)

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

Эта проверка деактивируется в анализе 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 неявно преобразуется в символ со знаком.

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

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

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

Предупреждение, если значение типа 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-последовательности не используются.
  • Восьмеричные константы, отличные от нулевых и восьмеричных выбегающих последовательностей, не используются.

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

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

 

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

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

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

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

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

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

8.2

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

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

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

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

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

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

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

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

Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.

Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access).

8.5

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

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

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

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

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

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

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

8.6

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

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

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

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

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

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

Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.

Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access).

8.9

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

  • Процедура/глобальная переменная ХХ определена кратно.

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

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

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

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

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

Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.

Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access).

8.10

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

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

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

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

Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.

Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access).

8.11

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

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

 
8.12

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

Необходимо явно указать размер массива «» XX «».

 

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

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

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

 

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

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

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

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

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

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

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

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

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

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

О нарушении не сообщается, если все следующие данные соответствуют действительности:

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

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

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

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

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

10.2

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

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

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

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

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

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

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

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

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

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

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

Порядок базовых типов ANSI C (float, double) определяет, что T2 шире T1, если T2 находится справа от T1 или T2 = T1.

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

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

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

10.3

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

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

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

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

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

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

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

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

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

10.4

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

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

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

10.5

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

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

 
10.6

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

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

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

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

int a = 2147483648;

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

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

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

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

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

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

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

11.2

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

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

Также имеется предупреждение о потере квалификатора

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

11.3

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

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

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

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

11.4

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

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

 
11.5

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

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

Распространяется на все преобразования

Выражения

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

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

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

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

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

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

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

12.3

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

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

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

12.4

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

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

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

12.5

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

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

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

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

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

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

12.6

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

  • Операнд логического оператора «!» должен быть логическим.

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

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

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

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

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

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

unsigned char flag;
if (!flag)

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

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

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

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

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

12.7

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

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

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

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

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

Базовый тип для целого числа подписывается в следующих случаях:

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

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

12.8

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

  • сумма смены отрицательна

  • количество смен больше 64

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

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

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

12.9

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

  • Унарный - операнд неподписанного нижележащего типа XX.

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

Базовый тип для целого числа подписывается в следующих случаях:

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

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

12.10

Оператор запятой не используется.

Оператор запятой не используется.

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

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

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

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

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

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

    union {
     float f;
     int i;
    } …
    

12.13

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

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

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

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

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

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

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

 

13.2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.

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

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

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

Нарушение правила появляется при проверке 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

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

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

Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.

14.2

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

Все ненулевые операторы должны:

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

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

 
14.3

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

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

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

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

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

  • в той же строке имеется нечто иное, чем комментарий после символа «»; «».

14.4

Оператор goto не используется.

Оператор goto не используется.

 
14.5

Инструкция continue не используется.

Инструкция continue не используется.

 
14.6

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

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

 
14.7

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

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

 
14.8

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

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

  • Тело для заявления является составным заявлением.

  • Тело оператора переключения должно быть составным оператором

 
14.9

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

  • За конструкцией 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 не должно представлять значение, которое является логическим

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

15.5

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

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

 

Функции

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

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

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

 
16.2

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

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

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

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

16.3

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

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

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

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

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

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

16.5

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

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

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

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

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

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

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

16.7

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

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

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

16.8

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

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

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

16.9

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

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

 
16.10

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Индексирование массива на указателях, не являющихся массивами.

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

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

Это правило соответствует ISO/IEC TS 17961 ID 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' ожидает «FILENAME» или < FILENAME >

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

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

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

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

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

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

  • число

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

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

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

  • конструкция do-while-zero

19.5

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

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

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

 
19.6

# undef не используется.

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

 
19.7

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

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

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

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

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

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

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

 
19.9

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

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

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

19.10

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

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

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

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

19.11

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

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

 
19.12

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

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

 
19.13

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

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

 
19.14

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

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

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

Если файл заголовка имеет следующий формат:

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

или,

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

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

19.16

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

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

 
19.17

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

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

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

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

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

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

  • unterminated '# if' условный.

  • незавершенный условный «# ifdef».

  • незавершенный условный «» # ifndef «».

 

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

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

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

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

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

 
20.2

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

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

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

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

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

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

20.3

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

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

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

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

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

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

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

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

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

20.4

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

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

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

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

20.5

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

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

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

20.6

Смещение макросов в библиотеке < 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

Библиотечные функции atoi, atoi и atoll из библиотеки < stdlib.h > не используются.

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

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

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

20.11

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

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

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

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

20.12

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

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

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

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

Сбои во время выполнения

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

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

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

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

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

 

Сделано Полиспейсом. Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.

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

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

Средство проверки правил кодирования 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 (Обязательно)

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

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