В следующих таблицах перечислены MISRA C®: 2004 правила кодирования, которые Polyspace® поддерживается проверка правил кодирования. Подробная информация о том, как программное обеспечение проверяет отдельные правила и любые ограничения по объему проверки, приводится в колонке «Спецификация Polyspace».
Примечание
Проверка правил кодирования Polyspace:
Поддерживает MISRA-C:2004 техническое исправление 1 для правил 4.1, 5.1, 5.3, 6.1, 6.3, 7.1, 9.2, 10.5, 12.6, 13.5 и 15.0.
Проверяет правила, заданные в MISRA AC AGC Guidelines для применения MISRA-C:2004 в контексте автоматической генерации кода.
Программа сообщает о большинстве нарушений на фазе компиляции анализа. Однако программное обеспечение обнаруживает нарушения правил 9.1 (Non-initialized variable
), 12.11 (одна из проверок переполнения) с помощью -scalar-overflows-checks signed-and-unsigned
), 13.7 (мертвый код), 14.1 (мертвый код), 16.2 и 21.1 во время анализа кода и сообщает об этих нарушениях как об ошибках времени выполнения.
Примечание
Некоторые нарушения правил 13.7 и 14.1 сообщаются на фазе компиляции анализа.
Если вы ожидаете нарушения правил, но не видите его, проверьте «Стандартные нарушения кодирования не отображаются».
N. | MISRA® Определение | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
1.1 | Весь код должен соответствовать ISO® 9899:1990 «Языки программирования - C», с поправками и исправлениями ISO/IEC 9899/COR1:1995, ISO/IEC 9899/AMD1:1995 и ISO/IEC 9899/COR2:1996. | Текстовое
| Все поддерживаемые расширения приводят к нарушению этого правила MISRA. Стандартные сообщения об ошибке компиляции не приводят к нарушению этого правила MISRA и остаются неизменными. |
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
2.1 | Язык сборки должен быть инкапсулирован и изолирован. | Язык сборки должен быть инкапсулирован и изолирован. | Никаких предупреждений, если код инкапсулирован в следующем:
|
2.2 | Исходный код должен использовать только комментарии/* */style | Комментарии C++ не должны использоваться. | Комментарии C++ обрабатываются как комментарии, но приводят к нарушению этого правила MISRA Примечание.Это правило нельзя аннотировать в исходном коде. |
2.3 | Последовательность символов/* не должна использоваться в комментарии | Последовательность символов/* не должна отображаться в комментарии. | Это нарушение правил также возникает, когда последовательность символов/* внутри комментария C++. Примечание.Это правило нельзя аннотировать в исходном коде. |
2.4 | Разделы кода не должны быть «закомментированы» | Разделы кода не должны быть «закомментированы» | Чекер использует внутреннюю эвристику, чтобы обнаружить закомментированный код. Для образца такие символы, как Шашка не помечает следующие комментарии, даже если они содержат код:
Чекер считает, что эти комментарии предназначены для целей документации или были внесены преднамеренно с некоторой дальновидностью. |
Правило | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
3.4 | Все виды применения директивы # pragma должны быть задокументированы и разъяснены. | Все виды применения директивы # pragma должны быть задокументированы и разъяснены. | Чтобы проверить это правило, вы должны перечислить прагмы, которые разрешены в исходных файлах, используя опцию Allowed pragmas (-allowed-pragmas) . Если Polyspace находит прагму, не входящую в допустимый список прагмы, возникает нарушение. |
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
4.1 | Должны использоваться только те эвакуационные последовательности, которые определены в стандарте ISO C. | \ < символ > не является выходной последовательностью ISO C Должны использоваться только те выходные последовательности, которые определены в стандарте ISO C. | |
4.2 | Триграфы не должны использоваться. | Триграфы не должны использоваться. | Триграфы обрабатываются и преобразуются в эквивалентный символ, но приводят к нарушению правила MISRA |
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
5.1 | Идентификаторы (внутренние и внешние) не должны полагаться на значимость более 31 символа | Идентификатор 'XX' не должен полагаться на значимость более 31 символа. | Проверяются все идентификаторы (глобальные, статические и локальные). Для более легкого просмотра, проверка правил показывает все идентификаторы, которые имеют те же первые 31 символ, что и одно нарушение правил. В истории событий нарушения правил можно увидеть все образцы конфликтующих имен идентификаторов. Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access). |
5.2 | Идентификаторы во внутренних возможностях не должны использовать то же имя, что и идентификаторы во внешних возможностях, и поэтому скрывать этот идентификатор. |
| Принимает, что правило 8.1 не нарушается. |
5.3 | Имя typedef должно быть уникальным идентификатором | {typedef name} «»% s «» не следует повторно использовать. (уже используется как {typedef name} в% s:% d) | Предупреждение, когда имя typedef повторно используется как другое имя идентификатора. |
5.4 | Имя тега должно быть уникальным идентификатором | {имя тега} «»% s «» не следует повторно использовать. (уже используется как {имя тега} в% s:% d) | Предупреждение, когда имя тега повторно используется как другое имя идентификатора Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access). |
5.5 | Не следует повторно использовать идентификатор объекта или функции со статической длительностью хранения. | {статический идентификатор/имя параметра} «% s» не следует повторно использовать. (уже используется как {статический идентификатор/имя параметра} со статической продолжительностью хранения в% s:% d) | Предупреждение, когда статическое имя повторно используется как другое имя идентификатора Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам. |
5.6 | Ни один идентификатор в одном пространстве имен не должен иметь такой же орфографии, как идентификатор в другом пространстве имен, за исключением структуры и имен представителей объединения. | {представитель} «»% s «» не следует повторно использовать. (уже используется как {представитель} в% s:% d) | Предупреждение при Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access). |
5.7 | Имя идентификатора не должно использоваться повторно. | {идентификатор} «»% s «» не должен использоваться повторно. (уже используется как {identifier} в% s:% d) | О нарушениях не сообщается, когда:
|
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
6.1 | Обычный тип char должен использоваться только для хранения и использования значений символов | Только допустимые операторы на простых графиках: '=', '= =' или '! =', явные приведения к интегральным типам и '?' (для 2-го и 3-го операндов) | Предупреждение, когда обычный char используется с оператором, отличным от =, = =,! =, явное приведение к интегральным типам или как второй или третий операнд? оператор. |
6.2 | Подписанный и беззнаковый тип char должен использоваться только для хранения и использования числовых значений. |
| Предупреждение, если значение обычного типа char неявно преобразуется в значение типа signed char или беззнакового char. |
6.3 | вместо основных типов следует использовать шрифты, указывающие на размер и сигнальность | вместо основных типов следует использовать шрифты, указывающие на размер и сигнальность. | В определении typedef предупреждение не приводится. |
6.4 | Битовые поля должны быть определены только как беззнаковые int или signed int. | Битовые поля должны быть определены только как беззнаковые int или signed int. | |
6.5 | Битовые поля типа int должны иметь длину не менее 2 бит. | Битовые поля типа int должны иметь длину не менее 2 бит. | Нет предупреждений на анонимных входных битовых полях ширины 0 - расширен на все подписанные битовые поля размера < = 1 (если нарушено правило 6.4). |
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
7.1 | Восьмеричные константы (кроме нуля) и восьмеричные выходные последовательности не должны использоваться. |
|
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
8.1 | Функции должны иметь объявления прототипа, и прототип должен быть виден как при определении функции, так и при вызове. |
| Прототип, видимый по вызову, должен быть завершен. |
8.2 | Всякий раз, когда объект или функция объявлены или определены, его тип должен быть четко указан | Всякий раз, когда объект или функция объявлены или определены, его тип четко указывается. | |
8.3 | Для каждого функционального параметра тип, указанный в декларации и определении, должен быть идентичным, а типы возврата должны также совпадать. | Определение функции 'XX' несовместимо с ее объявлением. | Принимает, что правило 8.1 не нарушается. Правило ограничено совместимыми типами. Можно отключить |
8.4 | Если объекты или функции объявлены более одного раза, их типы должны быть совместимыми. |
| Нарушения этого правила могут быть сгенерированы во время фазы ссылки. Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам. Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access). |
8.5 | В заголовочном файле не должно быть определений объектов или функций |
| Предварительные определения рассматриваются как определения. Для объектов со возможностями файла предварительными определениями являются объявления, которые:
|
8.6 | Функции должны всегда объявляться в возможностях файла. | Функция 'XX' должна быть объявлена в области файлов. | Это правило сопоставлено с идентификатором ISO/IEC TS 17961
addrescape |
8.7 | Объекты должны быть определены в возможности, если они доступны только из одной функции | Объект 'XX' должен быть объявлен в блок возможностей. | Ограничены статическими объектами. |
8.8 | Внешний объект или функция должны быть объявлены в одном файле и только в одном файле | Функция/Объект 'XX' имеет внешние объявления в нескольких файлах. | Ограничены явными объявлениями extern (предварительные определения игнорируются). Polyspace считает, что переменные или функции объявлены Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам. Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access). |
8.9 | Идентификатор с внешним редактированием должен иметь только одно внешнее определение. |
| Проверка помечает несколько определений только в том случае, если определения происходят в разных файлах. На предопределенных символах предупреждения не появляются. Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам. Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access). |
8.10 | Все объявления и определения объектов или функций в объеме файла должны иметь внутреннее редактирование, если не требуется внешнее редактирование | Функция/Переменная XX должна иметь внутреннее редактирование. | Принимает, что 8.1 не нарушается. Нет предупреждения, если использует 0. Если ваш код не содержит Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам. Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access). |
8.11 | Спецификатор статического класса памяти должен использоваться в определениях и декларациях объектов и функций, имеющих внутренние редактирования | статический спецификатор класса памяти должен использоваться для символа внутреннего редактирования XX. | |
8.12 | Когда массив объявлен с внешним редактированием, его размер должен быть указан явно или определен неявно путем инициализации | Размер массива 'XX' должен быть явно указан. |
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
9.1 | Перед использованием всем автоматическим переменным должно быть присвоено значение. | Проверяется во время анализа кода. Нарушения, отображаемые как Неинициализированные результаты переменной. Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам. В Code Prover также можно увидеть различие в результатах, основанную на вашем выборе для опции | |
9.2 | Скобки должны использоваться для указания и согласования структуры в ненулевой инициализации массивов и структур. | Скобки должны использоваться для указания и соответствия структуры в ненулевой инициализации массивов и структур. | |
9.3 | В списке перечислителей конструкция = не должна использоваться для явной инициализации представителей, отличных от первой, если только все элементы не инициализированы явным образом. | В списке перечислителей конструкция = не должна использоваться для явной инициализации представителей, отличных от первой, если только все элементы не инициализированы явным образом. |
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
10.1 | Значение выражения целого типа не должно неявно преобразовываться в другой базовый тип, если:
|
| Основа типов ANSI C (signed char, short, int, long) определяет, что T2 шире T1, если T2 находится справа от T1 или T2 = T1. Такая же интерпретация применяется и к беззнаковой версии базовых типов. Выражение типа bool или enum имеет int как базовый тип. Обычный char мог иметь подписанный или неподписанный базовый тип (в зависимости от целевого строения Polyspace или настройки опций). Базовый тип простого выражения struct.bitfield является базовым типом, используемым в определении битового поля, ширина битового поля не лексемы в расчет и принимает, что для битового поля используются только подписанные | беззнаковые int (Правило 6.4). О нарушениях не сообщается, когда:
Никаких нарушений не сообщалось, когда все следующие значения true:
Об операциях с указателями нарушений не сообщалось. Преобразования констант не сообщаются для этих случаев, чтобы избежать слишком многих нарушений. Если константа может быть представлена как в исходном, так и в преобразованном типах, преобразование происходит в меньшей степени. |
10.2 | Значение выражения плавающего типа не должно неявно преобразовываться в другой тип, если
|
| Основа типов ANSI C (с плавающей точкой, double) определяет, что T2 шире T1, если T2 находится справа от T1 или T2 = T1. О нарушениях не сообщается, когда:
|
10.3 | Значение комплексного выражения целого типа может быть приведено только к типу, который уже и имеет ту же сигнальность, что и базовый тип выражения | Комплексное выражение базового типа XX может быть приведено только к более узкому целому типу с той же сигнальностью, однако целевой тип является XX. |
|
10.4 | Значение комплексного выражения типа с плавающей точкой может быть приведено только к более узкому плавающему типу | Комплексное выражение XX типа может быть приведено только к более узкому плавающему типу, однако конечным типом является XX. | Основа типов ANSI C (с плавающей точкой, double) определяет, что T1 уже T2, если T2 находится справа от T1 или T2 = T1. |
10.5 | Если побитовые ~ оператора и < < применяются к операнду базового типа без знака char или без знака short, результат должен быть немедленно приведен к базовому типу операнда | Bitwize [<<|~] применяется к операнду базового типа [без знака char 'unsigned short], результат должен быть немедленно приведен к базовому типу. | |
10.6 | Суффикс «U» применяется ко всем константам неподписанных типов | Нет явного суффикса 'U для констант неподписанного типа. | Предупреждение, когда тип, определенный из значения и основы (восьмеричный, десятичный или шестнадцатеричный), не подписан и суффикса нет Для примера, когда размер int a = 2147483648; Существует различие между десятичной и шестнадцатеричной константами при |
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
11.1 | Преобразование не должно выполняться между указателем на функцию и любым типом, отличным от интегрального типа | Преобразование не должно выполняться между указателем на функцию и любым типом, отличным от интегрального типа. | Приведения и неявные преобразования с использованием указателя на функцию. Смещения или неявные преобразования из |
11.2 | Преобразование не должно выполняться между указателем на объект и любым типом, отличным от интегрального типа, другим указателем на тип объекта или указателем на удаление | Преобразование не должно выполняться между указателем на объект и любым типом, отличным от интегрального типа, другим указателем на тип объекта или указателем на удаление. | Существует также предупреждение о потере квалификатора Это правило сопоставлено с идентификатором ISO/IEC TS 17961
alignconv |
11.3 | Приведение не должно выполняться между типом указателя и интегральным типом | Приведение не должно выполняться между типом указателя и интегральным типом. | Исключение при нулевой константе. Расширенный ко всем преобразованиям Это правило сопоставлено с идентификатором ISO/IEC TS 17961
alignconv |
11.4 | Приведение не должно выполняться между указателем на тип объекта и другим указателем на тип объекта. | Приведение не должно выполняться между указателем на тип объекта и другим указателем на тип объекта. | |
11.5 | Не должно выполняться приведение, которое удаляет любую несовпадающую или изменчивую проверку из типа, адресованного указателем. | Не должно выполняться приведение, которое удаляет любую несовпадающую или изменчивую проверку из типа, адресованного указателем. | Расширенный ко всем преобразованиям |
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
12.1 | Ограниченная зависимость должна быть помещена в выражения в правилах приоритета операторов C | Ограниченная зависимость должна быть помещена в выражения в правилах приоритета операторов C | |
12.2 | Значение выражения должно быть тем же самым в любом порядке оценки, который позволяет стандарт. |
| Проверка правила 12.2 предполагает, что в выражениях, которые дают логические значения (правило 13.1), назначение не выполняется. Выражение является простым выражением символов. |
12.3 | The | The | Нет предупреждений о летучих доступах |
12.4 | Операнд правой руки логического & & или || оператора не должен содержать побочных эффектов. | Операнд правой руки логического & & или || оператора не должен содержать побочных эффектов. | Нет предупреждений о летучих доступах |
12.5 | Операнды логического & & или || должны быть первичными. |
| Во время предварительной обработки нарушения этого правила обнаруживаются в выражениях в директивах # if. Разрешено исключение для ассоциативно (a & & b & & c), (a || b || c). |
12.6 | Операнды логических операторов (& &, || и!) должны быть эффективно логическими. Выражение, которое эффективно является логическим, не должно использоваться в качестве операторов для других операторов (& &, || или!). |
| Операнд логического оператора должен быть логическим типом данных. Несмотря на то, что стандарт C явным образом не определяет тип логических данных, стандарт неявно предполагает использование типа логических данных. Некоторые операторы могут возвращать логические выражения, например Примите во внимание следующий код: unsigned char flag; if (!flag) Проверка правил сообщает о нарушении правила 12.6: Operand of '!' logical operator should be effectively Boolean. flag является не логическим, а unsigned char .Чтобы соответствовать правилу 12.6, код должен быть переписан либо как if (!( flag != 0)) if (flag == 0) Использование опции |
12.7 | Битовые операторы не должны применяться к операторам, основной тип которых подписан |
| Базовый тип для целого числа подписан, когда:
|
12.8 | Операнд правой руки оператора сдвига должен находиться между нулем и на единицу меньше ширины в битах базового типа операнда левой руки. |
| Числа, которыми манипулируют в директивах предварительной обработки, имеют ширину 64 бита, так что допустимая область значений сдвигов находится между 0 и 63 Проверка также распространяется на битовые поля с шириной поля или шириной базового типа, когда она находится в пределах комплексного выражения |
12.9 | Оператор унарного минуса не применяется к выражению, базовый тип которого не подписан. |
| Базовый тип для целого числа подписан, когда:
|
12.10 | Оператор запятыми не должен использоваться. | Оператор запятыми не должен использоваться. | |
12.11 | Оценка постоянного беззнакового выражения не должна приводить к обертыванию. | Оценка постоянных беззнаковых целочисленных выражений не должна приводить к переносу. | |
12.12 | Базовые битовые представления значений с плавающей точкой не должны использоваться. | Базовые битовые представления значений с плавающей точкой не должны использоваться. | Предупреждение, когда:
|
12.13 | Операторы шага (+ +) и декремента (--) не должны смешиваться с другими операторами в выражении | Операторы шага (+ +) и декремента (--) не должны смешиваться с другими операторами в выражении | Предупреждение, когда операторы++ или -- не используются в одиночку. |
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
13.1 | Операторы назначения не должны использоваться в выражениях, которые дают логические значения. | Операторы назначения не должны использоваться в выражениях, которые дают логические значения. |
|
13.2 | Тесты значения против нуля должны быть сделаны явными, если только операнд не является фактически логическим | Тесты значения против нуля должны быть сделаны явными, если только операнд не является фактически логическим | На целочисленных константах предупреждение не выдается. Пример: if (2) Использование опции |
13.3 | Выражения с плавающей точкой не должны проверяться на равенство или неравенство. | Выражения с плавающей точкой не должны проверяться на равенство или неравенство. | Предупреждение о направлениях только тестов. |
13.4 | Управляющее выражение оператора for не должно содержать никаких объектов плавающего типа | Управляющее выражение оператора for не должно содержать никаких объектов плавающего типа | Если for index является символом переменной, проверяется, что он не является символом с плавающей точкой. |
13.5 | Три выражения оператора for касаются только управления циклом |
| Проверяется, является ли индекс цикла for (V) символом переменной; проверяется, является ли V последней назначенной переменной в первом выражении (если оно присутствует). Проверяется, является ли в первом выражении, если оно присутствует, присвоением V; проверяется, должно ли во втором выражении, если оно присутствует, быть сравнение V; Проверяется, если в 3-м выражении, если оно присутствует, должно быть присвоение V. |
13.6 | Числовые переменные, используемые в цикле for для подсчета итерации, не должны изменяться в теле цикла. | Числовые переменные, используемые в цикле for для подсчета итерации, не должны изменяться в теле цикла. | Обнаруживать только прямые назначения, если известен индекс цикла for и является ли он символом переменной. |
13.7 | Логические операции, результаты которых инвариантны, не допускаются |
| Во время компиляции проверяйте сравнения по крайней мере с одним постоянным операндом. Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.
В Code Prover также можно увидеть различие в результатах, основанную на вашем выборе для опции Нарушение правил появляется при проверке, является ли enum ec {RED, BLUE, GREEN} col; for(col=RED; col<=GREEN; col++) {} enum переменная может потенциально обернуться, когда приращение выходит за пределы ее области значений, и условие цикла может всегда быть верным. Чтобы избежать нарушения правила, можно привести перечисление к целому числу перед сравнением, например:enum ec {RED, BLUE, GREEN} col; for(col=RED; (int)col<=GREEN; col++ ) {} |
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
14.1 | Не должно быть недостижимого кода. | Не должно быть недостижимого кода. | Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам. |
14.2 | Все операторы, отличные от null, должны иметь или по крайней мере один побочный эффект, однако выполненный, или привести к изменению потока управления | Все операторы без нуля должны:
| |
14.3 | Перед предварительной обработкой в линии само по себе происходит нулевой оператор; за ним может последовать комментарий при условии, что первый символ, следующий за оператором null, является символом белого пространства. | Оператор null должен находиться в линии сам по себе | Мы предполагаем, что ';' является пустым оператором, когда он является первым символом на линию (исключая комментарии). Правило нарушается, когда:
|
14.4 | Не допускается использование оператора goto. | Не допускается использование оператора goto. | |
14.5 | Продолжение оператора не должно использоваться. | Продолжение оператора не должно использоваться. | |
14.6 | Для любого оператора итерации должен быть не более одного оператора пропуска, используемого для завершения цикла | Для любого оператора итерации должен быть не более одного оператора пропуска, используемого для завершения цикла | |
14.7 | Функция должна иметь одну точку выхода в конце функции | Функция должна иметь одну точку выхода в конце функции | |
14.8 | Оператор, образующий тело коммутатора, в то время как, делать в то время или для оператора, должен быть составным оператором |
| |
14.9 | За конструкцией if (выражение) следует составной оператор. За другим ключевым словом следует либо составной оператор, либо другой оператор if |
| |
14.10 | Все, если еще конструкции должны содержать предложение final else. | Все, если еще конструкции должны содержать предложение final 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 | Метка switch должна использоваться только в том случае, если наиболее близко заключенный составной оператор является телом оператора switch | Метка switch должна использоваться только в том случае, если наиболее близко заключенный составной оператор является телом оператора switch | |
15.2 | Оператор безоговорочного пропуска прекращает действие каждого пункта о непустом переключателе | Оператор безоговорочного пропуска прекращает действие каждого пункта о непустом переключателе | Предупреждение для каждого положения о несоответствующем делу. |
15.3 | Конечным пунктом оператора switch является пункт по умолчанию | Конечным пунктом оператора switch является пункт по умолчанию | |
15.4 | Выражение switch не должно представлять значение, которое эффективно является логическим | Выражение switch не должно представлять значение, которое эффективно является логическим | Использование опции |
15.5 | Каждый оператор switch должен иметь по крайней мере один пункт случая | Каждый оператор switch должен иметь по крайней мере один пункт случая |
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
16.1 | Функции не должны определяться переменным числом аргументов. | Функция XX не должна быть определена как varargs. | |
16.2 | Функции не должны вызывать себя, прямо или косвенно. | Функция% s не должна вызывать сама себя. | Чекер сообщает о каждой функции, которая вызывает себя, прямо или косвенно. Даже если несколько функций участвуют в одном цикле рекурсии, каждая функция сообщается индивидуально. Общее количество циклов рекурсии можно вычислить с помощью метрики сложности кода |
16.3 | Идентификаторы должны быть даны для всех параметров в объявлении прототипа функции. | Идентификаторы должны быть даны для всех параметров в объявлении прототипа функции. | Принимает, что правило 8.6 не нарушено. |
16.4 | Идентификаторы, используемые в объявлении и определении функции, должны быть идентичными. | Идентификаторы, используемые в объявлении и определении функции, должны быть идентичными. | Принимает, что правила 8.8, 8.1 и 16.3 не нарушаются. Все вхождения обнаружены. |
16.5 | Функции без параметров должны быть объявлены с типом параметра void. | Функции без параметров должны быть объявлены с типом параметра void. | Также проверяются определения. |
16.6 | Количество аргументов, переданных функции, должно совпадать с количеством параметров. |
| Принимает, что правило 8.1 не нарушается. Это правило сопоставлено с идентификатором ISO/IEC TS 17961
argcomp |
16.7 | Параметр указателя в прототипе функции должен быть объявлен как указатель на | Параметр указателя в прототипе функции должен быть объявлен как указатель на | Предупреждение, если не |
16.8 | Все выходные пути из функции с непустым типом возврата должны иметь явный оператор возврата с выражением. | Отсутствующее возвращаемое значение для непустой функции XX. | Предупреждение, когда функция, не являющаяся пустой, не прерывается безусловным возвратом с выражением. |
16.9 | Идентификатор функции должен использоваться только с предыдущим &, или со списком параметров в круглых скобках, который может быть пустым. | Идентификатору функции XX должен предшествовать & или последующий список параметров. | |
16.10 | Если функция возвращает информацию об ошибке, эта информация об ошибке должна быть проверена. | Если функция возвращает информацию об ошибке, эта информация об ошибке должна быть проверена. | Шашечные флаги функционируют без Шашка не помечает функции |
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
17.1 | Арифметика указателя применяется только к указателям, которые адресованы элементу массива или массива. | Арифметика указателя применяется только к указателям, которые адресованы элементу массива или массива. | |
17.2 | Вычитание указателя должно применяться только к указателям, которые адресуют элементы одного массива | Вычитание указателя применяется только к указателям, которые адресуют элементы одного массива. | |
17.3 | >, > =, <, < = не применяется к типам указателей, кроме тех случаев, когда они указывают на один и тот же массив. | >, > =, <, < = не применяется к типам указателей, кроме тех случаев, когда они указывают на один и тот же массив. | |
17.4 | Индексация массива должна быть единственно допустимой формой арифметики указателя. | Индексация массива должна быть единственно допустимой формой арифметики указателя. | Предупреждение о:
|
17.5 | Тип не должен содержать более 2 уровней опосредования указателя | Тип не должен содержать более 2 уровней опосредования указателя | |
17.6 | Адрес объекта с автоматическим хранением не должен быть присвоен объекту, который может сохраняться после прекращения существования объекта. | Указатель на параметр является недопустимым возвращаемым значением. Указатель на локальное значение является недопустимым возвращаемым значением. | Предупреждение при назначении адреса глобальной переменной, возвращении локального адреса переменной или возвращении адреса параметра. Это правило сопоставлено с идентификатором ISO/IEC TS 17961
accfree |
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
18.1 | Все типы конструкций или объединений должны быть завершены в конце модуля перевода. | Все типы конструкций или объединений должны быть завершены в конце модуля перевода. | Предупреждение для всех неполных деклараций структур или объединений. |
18.2 | Объект не должен быть назначен перекрывающемуся объекту. |
| |
18.4 | Объединения не должны использоваться | Объединения не должны использоваться. |
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
19.1 | Операторам # include в файле должны предшествовать только другие директивы или комментарии предпроцессоров | Операторам # include в файле должны предшествовать только другие директивы или комментарии предпроцессоров | Сообщение отображается, когда директиве # include предшествуют другие вещи, чем директивы препроцессора, комментарии, пространства или «новые линии». |
19.2 | Нестандартные символы не должны присутствовать в именах заголовочных файлов в директивах # include |
| |
19.3 | После директивы # include следует последовательность < filename > или «filename». |
| |
19.4 | Макросы C должны расширяться только на инициализатор скобок, константу, выражение в круглых скобках, квалификатор типа, спецификатор класса памяти или конструкцию нуль. | Макрос «» < имя > «» не расширяется на совместимую конструкцию. | Мы предполагаем, что определение макроса не нарушает это правило, когда оно расширяется на:
|
19.5 | Макросы не должны быть # defined и # undefd внутри блока. |
| |
19.6 | # undef не должен использоваться. |
| |
19.7 | Функция должна использоваться в выборе функции, подобной макросу. | Функция должна использоваться в выборе функции like-macro | Сообщение обо всех функциональных определениях макросов. |
19.8 | Функциональный макрос не должен вызываться без всех его аргументов |
| |
19.9 | Аргументы в функциональный макрос не должны содержать лексемы, которые выглядят как директивы предварительной обработки. | Аргумент макроса не должен выглядеть как директива предварительной обработки. | Это правило обнаруживается как нарушенное, когда символ '#' появляется в аргументе макроса (вне строковой или символьной константы) |
19.10 | В определении функционального макроса каждый образец параметра должен быть заключен в круглые скобки, если он не используется в качестве операнда # или # #. | Образец параметра должен быть заключен в круглые скобки. | Если Программа не генерирует предупреждение, если параметр повторно используется в качестве аргумента функции или подобного функции макроса. Например, рассмотрим параметр x. Программное обеспечение не генерирует предупреждение, если |
19.11 | Все идентификаторы макросов в директивах препроцессора должны быть определены перед использованием, за исключением директивы предпроцессора # ifdef и # ifndef и оператора defined (). | '< имя >' не определено. | |
19.12 | Должно быть не более одного вхождения операторов предпроцессора # или # # в одном определении макроса. | Несколько вхождения операторов предварительной обработки # или # #. | |
19.13 | Операторы предпроцессора # и # не должны использоваться | Сообщение об определениях макросов, использующих операторы # или # # | |
19.14 | Определенный оператор препроцессора должен использоваться только в одной из двух стандартных форм. | 'defined' без идентификатора. | |
19.15 | Необходимо принять меры предосторожности, порядок предотвратить включение содержимого файла заголовка дважды. | Необходимо принять меры предосторожности в порядок предотвращения множественных включений. | Когда заголовочный файл форматирован как, #ifndef <control macro> #define <control macro> <contents> #endif или, #ifndef <control macro> #error ... #else #define <control macro> <contents> #endif принято, что были приняты меры предосторожности для предотвращения множественных включений. В противном случае обнаруживается нарушение этого правила MISRA. |
19.16 | Директивы предварительной обработки должны быть синтаксически значимыми, даже если исключены препроцессором. | директива не является синтаксически значимой. | |
19.17 | Все директивы # else, # elif и # endif предпроцессора должны находиться в том же файле, что и директива # if или # ifdef, с которой они связаны. |
|
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
20.1 | Зарезервированные идентификаторы, макросы и функции в стандартной библиотеке не должны быть определены, переопределены или неопределены. |
| |
20.2 | Имена стандартных библиотечных макросов, объектов и функций не должны использоваться повторно. | Идентификатор XX не должен использоваться. | В случае, если определен макрос, имя которого соответствует стандартному библиотечному макросу, объекту или функции, правило, которое обнаруживается как нарушенное, является 20.1. Предварительные определения рассматриваются как определения. Для объектов со возможностями файла предварительными определениями являются объявления, которые:
|
20.3 | Проверяется валидность значений, переданных в библиотечные функции. | Проверяется достоверность значений, переданных в библиотечные функции | Предупреждение для аргумента в вызове функции библиотеки, если все следующие значения true:
Функция библиотеки может быть одной из следующих: Bug Finder и Code Prover проверяют это правило по-разному. Анализ может привести к различным результатам. |
20.4 | Динамическое выделение памяти «куча» не должно использоваться. |
| В случае, если динамические функции выделения памяти «куча» на самом деле являются макросами, и макрос расширен в коде, это правило обнаруживается как нарушенное. Принимает, что правило 20.2 не нарушено. |
20.5 | Индикатор ошибки errno не должен использоваться | Индикатор ошибки errno не должен использоваться | Принимает, что правило 20.2 не нарушается |
20.6 | Смещение макроса в библиотеке < stddef.h > не должно использоваться. |
| Принимает, что правило 20.2 не нарушается |
20.7 | Макрос setjmp и функция longjmp не должны использоваться. |
| В случае, если функция longjmp на самом деле является макросом, и макрос расширен в коде, это правило обнаруживается как нарушенное. Принимает, что правило 20.2 не нарушается |
20.8 | Средства обработки сигналов < signal.h > не должны использоваться. |
| В случае, если некоторые функции сигнала являются фактически макросами и расширены в коде, это правило обнаруживается как нарушенное. Принимает, что правило 20.2 не нарушается |
20.9 | Библиотека ввода/вывода < stdio.h > не должна использоваться в производственном коде. |
| В случае, если функции библиотеки ввода/вывода являются фактически макросами и расширены в коде, это правило обнаруживается как нарушенное. Принимает, что правило 20.2 не нарушается |
20.10 | Не должны использоваться библиотечные функции atof, atoi и atoll из библиотеки < stdlib.h >. |
| В случае, если функции atof, atoi и atoll на самом деле являются макросами и расширяются, это правило обнаруживается как нарушенное. Принимает, что правило 20.2 не нарушается |
20.11 | Не должны использоваться функции library abort, exit, getenv и система из библиотеки < stdlib.h >. |
| В случае, если прерывание, выход, getenv и системные функции на самом деле являются макросами и расширяются, это правило обнаруживается как нарушенное. Принимает, что правило 20.2 не нарушается |
20.12 | Функции обработки времени библиотеки < time.h > не должны использоваться. |
| В случае, если функции обработки времени фактически являются макросами и расширены, это правило определяется как нарушенное. Принимает, что правило 20.2 не нарушается |
N. | Определение MISRA | Сообщения в файле отчета | Реализация Polyspace |
---|---|---|---|
21.1 | Минимизация отказов в работе должна обеспечиваться при помощи, по крайней мере, одного из:
| Сделано Polyspace. Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам. В Code Prover также можно увидеть различие в результатах, основанную на вашем выборе для опции |
Проверка правил кодирования Polyspace не проверяет следующие правила C:2004 кодирования MISRA. Эти правила не могут быть применены, так как они находятся вне возможностей программного обеспечения Polyspace. Они могут касаться документации, динамических аспектов или функциональных аспектов правил MISRA. В столбце Дополнительная информация описывается причина, по которой каждое правило не проверяется.
Правило | Описание | Дополнительная информация |
---|---|---|
1.2 (Обязательно) | Не следует полагаться на неопределенное или неопределенное поведение | Статически не проверяется, если только не учитываются динамические свойства данных |
1.3 (Обязательно) | Несколько компиляторов и/или языков должны использоваться только в том случае, если существует общий определенный стандарт интерфейса для объектного кода, которому соответствуют языки/компиляторы/ассемблеры. | Это метод правила процесса. |
1.4 (Обязательно) | Компилятор/линкер/идентификаторы (внутренние и внешние) не должны полагаться на значимость более 31 символа. Кроме того, компилятор/линкер должен быть проверен, чтобы убедиться, что для внешних идентификаторов поддерживаются 31 символ значимости и чувствительности к регистру. | Чтобы соблюдать это правило, проверьте документацию компилятора. |
1.5 (Консультационный) | Реализации с плавающей точкой должны соответствовать определенному стандарту с плавающей точкой. | Чтобы соблюдать это правило, проверьте документацию компилятора. |
Правило | Описание | Дополнительная информация |
---|---|---|
3.1 (Обязательно) | Все виды использования определяемого реализацией поведения должны быть задокументированы. | Чтобы соблюдать это правило, проверьте документацию компилятора. Выявление ошибок основано на неопределенном поведении, в соответствии с выбором, сделанным для конструкций, заданных реализацией. |
3.2 (Обязательно) | Набор символов и соответствующая кодировка должны быть задокументированы. | Чтобы соблюдать это правило, проверьте документацию компилятора. |
3.3 (Консультация) | Реализация целочисленного деления в выбранном компиляторе должна быть определена, задокументирована и учтена. | Чтобы соблюдать это правило, проверьте документацию компилятора. |
3.5 (Обязательно) | Определяемое реализацией поведение и упаковка битовых полей должны быть задокументированы, если на них полагаются. | Чтобы соблюдать это правило, проверьте документацию компилятора. |
3.6 (Обязательно) | Все библиотеки, используемые в производственном коде, должны быть написаны в соответствии с положениями настоящего документа и подлежат соответствующей валидации. | Чтобы соблюдать это правило, проверьте документацию компилятора. |
Правило | Описание | Дополнительная информация |
---|---|---|
18.3 (Обязательно) | Область памяти не должна повторно использоваться в несвязанных целях. | «назначение» - вопрос функционального проекта. |