На начальной фазе компиляции анализа, Polyspace® проверяет те правила кодирования, которые не требуют части анализа для обнаружения ошибок времени выполнения. Если необходимо проверить только эти правила, можно выполнить намного более быстрый анализ.
Программа предоставляет два предопределенных подмножества правил, которые она проверяет ранее в анализе. Подмножества доступны с опциями Check MISRA C:2004 (-misra2)
, Check MISRA AC AGC (-misra-ac-agc)
, и Check MISRA C:2012 (-misra3)
.
Аргумент | Цель |
---|---|
single-unit-rules | Проверяйте правила, которые применяются только к отдельным модулям перевода. Если вы обнаруживаете только нарушения правил кодирования и выбираете это подмножество, анализ Bug Finder останавливается после фазы компиляции. |
system-decidable-rules | Проверяйте правила в Если вы обнаруживаете только нарушения правил кодирования и выбираете это подмножество, анализ Bug Finder останавливается после фазы связывания. |
Смотрите также «Проверка на нарушения правил кодирования».
Программа проверяет следующие правила в начале анализа. Правила, которые проверяются на уровень системы и появляются только в system-decidable-rules
подмножество обозначено звездочкой.
Окружение
Правило | Описание |
---|---|
1.1* | Весь код должен соответствовать ISO® 9899:1990 «Языки программирования - C», с поправками и исправлениями ISO/IEC 9899/COR1:1995, ISO/IEC 9899/AMD1:1995 и ISO/IEC 9899/COR2:1996. |
Языковые расширения
Правило | Описание |
---|---|
2.1 | Язык сборки должен быть инкапсулирован и изолирован. |
2.2 | Исходный код должен использовать только |
2.3 | Последовательность символов |
Документация
Правило | Описание |
---|---|
3.4 | Все виды использования |
Наборы символов
Правило | Описание |
---|---|
4.1 | Должны использоваться только те эвакуационные последовательности, которые определены в стандарте ISO C. |
4.2 | Триграфы не должны использоваться. |
Идентификаторы
Правило | Описание |
---|---|
5.1* | Идентификаторы (внутренние и внешние) не должны полагаться на значимость более 31 символа. |
5.2 | Идентификаторы во внутренних возможностях не должны использовать то же имя, что и идентификаторы во внешних возможностях, и поэтому скрывать этот идентификатор. |
5.3* | Имя typedef должно быть уникальным идентификатором. |
5.4* | Имя тега должно быть уникальным идентификатором. |
5.5* | Не следует повторно использовать идентификатор объекта или функции со статической длительностью хранения. |
5.6* | Ни один идентификатор в одном пространстве имен не должен иметь такой же орфографии, как идентификатор в другом пространстве имен, за исключением структуры и имен представителей объединения. |
5.7* | Имя идентификатора не должно использоваться повторно. |
Типы
Правило | Описание |
---|---|
6.1 | Обычный тип char должен использоваться только для хранения и использования значений символов. |
6.2 | Подписанный и беззнаковый тип char должен использоваться только для хранения и использования числовых значений. |
6.3 |
|
6.4 | Битовые поля должны быть определены только для типа |
6.5 | Битовые поля типа |
Константы
Правило | Описание |
---|---|
7.1 | Восьмеричные константы (кроме нуля) и восьмеричные выходные последовательности не должны использоваться. |
Декларации и определения
Правило | Описание |
---|---|
8.1 | Функции должны иметь объявления прототипа, и прототип должен быть виден как при определении функции, так и при вызове. |
8.2 | Всякий раз, когда объект или функция объявлены или определены, его тип четко указывается. |
8.3 | Для каждого функционального параметра тип, указанный в декларации и определении, должен быть идентичным, а типы возврата должны также совпадать. |
8.4* | Если объекты или функции объявлены более одного раза, их типы должны быть совместимыми. |
8.5 | В заголовочном файле не должно быть определений объектов или функций. |
8.6 | Функции должны всегда объявляться в возможностях файла. |
8.7 | Объекты должны быть определены в возможности, если они доступны только из одной функции. |
8.8* | Внешний объект или функция должны быть объявлены в одном файле и только в одном файле. |
8.9* | Идентификатор с внешним редактированием должен иметь только одно внешнее определение. |
8.10* | Все объявления и определения объектов или функций в объеме файла должны иметь внутреннее редактирование, если не требуется внешнее редактирование. |
8.11 | The |
8.12 | Когда массив объявлен с внешним редактированием, его размер должен быть указан явным или неявным образом путем инициализации. |
Инициализация
Правило | Описание |
---|---|
9.2 | Скобки должны использоваться для указания и соответствия структуры в ненулевой инициализации массивов и структур. |
9.3 | В списке перечислителей |
Преобразование арифметического типа
Правило | Описание |
---|---|
10.1 | Значение выражения целого типа не должно неявно преобразовываться в другой базовый тип, если:
|
10.2 | Значение выражения плавающего типа не должно неявно преобразовываться в другой тип, если
|
10.3 | Значение комплексного выражения целого типа может быть приведено только к типу, который является более узким и имеет ту же сигнальность, что и базовый тип выражения. |
10.4 | Значение комплексного выражения типа с плавающей точкой может быть приведено только к более узкому плавающему типу. |
10.5 | Если побитовый оператор |
10.6 | Суффикс «U» применяется ко всем константам |
Преобразование типа указателя
Правило | Описание |
---|---|
11.1 | Преобразование не должно выполняться между указателем на функцию и любым типом, отличным от интегрального типа. |
11.2 | Преобразование не должно выполняться между указателем на объект и любым типом, отличным от интегрального типа, другим указателем на тип объекта или указателем на |
11.3 | Приведение не должно выполняться между типом указателя и интегральным типом. |
11.4 | Приведение не должно выполняться между указателем на тип объекта и другим указателем на тип объекта. |
11.5 | Отливка не должна выполняться, чтобы удалить какие-либо |
Выражения
Правило | Описание |
---|---|
12.1 | Ограниченная зависимость должна быть помещена в выражения в правилах приоритета операторов С. |
12.3 | The |
12.5 | Операнды логического |
12.6 | Операнды логических операторов ( |
12.7 | Битовые операторы не должны применяться к операторам, основной тип которых подписан. |
12.9 | Оператор унарного минуса не применяется к выражению, базовый тип которого не подписан. |
12.10 | Оператор запятыми не должен использоваться. |
12.11 | Оценка постоянного беззнакового выражения не должна приводить к обертыванию. |
12.12 | Базовые битовые представления значений с плавающей точкой не должны использоваться. |
12.13 | Шаг ( |
Выражения оператора управления
Правило | Описание |
---|---|
13.1 | Операторы назначения не должны использоваться в выражениях, которые дают логические значения. |
13.2 | Тесты значения против нуля должны быть сделаны явными, если операнд не является фактически логическим. |
13.3 | Выражения с плавающей точкой не должны проверяться на равенство или неравенство. |
13.4 | Управляющее выражение |
13.5 | Три выражения |
13.6 | Числовые переменные, используемые в |
Управляйте потоком
Правило | Описание |
---|---|
14.3 | Все операторы без нуля должны либо
|
14.4 | The |
14.5 | The |
14.6 | Для любого оператора итерации должно быть самое большее одно |
14.7 | Функция должна иметь одну точку выхода в конце функции. |
14.8 | Оператор, образующее тело |
14.9 | Система координат |
14.10 | Все |
Операторы Switch
Правило | Описание |
---|---|
15.0 | Между |
15.1 | A |
15.2 | Безусловное |
15.3 | Окончательный пункт |
15.4 | A |
15.5 | Каждый |
Функции
Правило | Описание |
---|---|
16.1 | Функции не должны определяться переменным числом аргументов. |
16.3 | Идентификаторы должны быть даны для всех параметров в объявлении прототипа функции. |
16.4* | Идентификаторы, используемые в объявлении и определении функции, должны быть идентичными. |
16.5 | Функции без параметров должны быть объявлены с типом параметра |
16.6 | Количество аргументов, переданных функции, должно совпадать с количеством параметров. |
16.8 | Все выходные пути из функции с не- |
16.9 | Идентификатор функции должен использоваться только с предыдущим |
Указатели и массивы
Правило | Описание |
---|---|
17.4 | Индексация массива должна быть единственно допустимой формой арифметики указателя. |
17.5 | Тип не должен содержать более 2 уровней опосредования указателя. |
Структуры и объединения
Правило | Описание |
---|---|
18.1 | Все типы конструкций или объединений должны быть завершены в конце модуля перевода. |
18.4 | Объединения не должны использоваться. |
Директивы предварительной обработки
Правило | Описание |
---|---|
19.1 |
|
19.2 | Нестандартные символы не должны встречаться в именах заголовочных файлов в |
19.3 | The |
19.4 | Макросы C должны расширяться только на инициализатор скобок, константу, выражение в круглых скобках, квалификатор типа, спецификатор класса памяти или конструкцию нуль. |
19.5 | Макросы не должны быть |
19.6 |
|
19.7 | Функция должна использоваться в выборе функции, подобной макросу. |
19.8 | Функциональный макрос не должен вызываться без всех его аргументов. |
19.9 | Аргументы в функциональный макрос не должны содержать лексемы, которые выглядят как директивы предварительной обработки. |
19.10 | В определении функционального макроса каждый образец параметра должен быть заключен в круглые скобки, если он не используется в качестве операнда |
19.11 | Все идентификаторы макросов в директивах препроцессора должны быть определены перед использованием, кроме |
19.12 | Должно быть самое большее одно вхождение |
19.13 | The |
19.14 | Определенный оператор препроцессора должен использоваться только в одной из двух стандартных форм. |
19.15 | Необходимо принять меры предосторожности, порядок предотвратить включение содержимого файла заголовка дважды. |
19.16 | Директивы предварительной обработки должны быть синтаксически значимыми, даже если исключены препроцессором. |
19.17 | Все |
Стандартные библиотеки
Правило | Описание |
---|---|
20.1 | Зарезервированные идентификаторы, макросы и функции в стандартной библиотеке не должны быть определены, переопределены или неопределены. |
20.2 | Имена стандартных библиотечных макросов, объектов и функций не должны использоваться повторно. |
20.4 | Динамическое выделение памяти «куча» не должно использоваться. |
20.5 | Индикатор ошибки |
20.6 | Макрос |
20.7 | The |
20.8 | Средства обработки сигналов |
20.9 | Библиотека ввода/вывода |
20.10 | Библиотека функционирует |
20.11 | Библиотека функционирует |
20.12 | Функции обработки времени библиотечных |
Правила, которые проверяются на уровень системы и появляются только в system-decidable-rules
подмножество обозначено звездочкой.
Программа проверяет следующие правила в начале анализа. Правила, которые проверяются на уровень системы и появляются только в system-decidable-rules
подмножество обозначено звездочкой.
Стандартное окружение C
Правило | Описание |
---|---|
1.1 | Программа не должна содержать нарушений стандартного синтаксиса C и ограничений и не должна превышать пределов перевода реализации. |
1.2 | Языковые расширения не должны использоваться. |
Неиспользованный код
Правило | Описание |
---|---|
2.3* | Проект не должен содержать неиспользованных объявлений типов. |
2.4* | Проект не должен содержать неиспользованных объявлений тегов. |
2.5* | Проект не должен содержать неиспользованных объявлений макросов. |
2.6 | Функция не должна содержать неиспользованных объявлений меток. |
2.7 | В функциях не должно быть неиспользованных параметров. |
Комментарии
Правило | Описание |
---|---|
3.1 | Последовательности символов |
3.2 | Сращивание линий не должно использоваться в |
Наборы символов и лексические соглашения
Правило | Описание |
---|---|
4.1 | Восьмиугольные и шестнадцатеричные выходные последовательности должны быть прекращены. |
4.2 | Триграфы не должны использоваться. |
Идентификаторы
Правило | Описание |
---|---|
5.1* | Внешние идентификаторы должны быть отдельными. |
5.2 | Идентификаторы, объявленные в тех же возможностях и пространстве имен, должны быть различными. |
5.3 | Идентификатор, объявленный во внутренних возможностях, не должен скрывать идентификатор, объявленный во внешних возможностях. |
5.4 | Идентификаторы макросов должны быть различными. |
5.5 | Идентификаторы должны отличаться от макро- имен. |
5.6* | Имя typedef должно быть уникальным идентификатором. |
5.7* | Имя тега должно быть уникальным идентификатором. |
5.8* | Идентификаторы, определяющие объекты или функции с внешним редактированием, должны быть уникальными. |
5.9* | Идентификаторы, которые определяют объекты или функции с внутренним редактированием, должны быть уникальными. |
Типы
Правило | Описание |
---|---|
6.1 | Битовые поля должны быть объявлены только с соответствующим типом. |
6.2 | Однобитовые именованные битовые поля не должны иметь тип со знаком. |
Литералы и константы
Правило | Описание |
---|---|
7.1 | Восьмиугольные константы не должны использоваться. |
7.2 | Суффикс «u» или «U» применяется ко всем целочисленным константам, которые представлены в беззнаковом типе. |
7.3 | Строчный символ «l» не должен использоваться в буквальном суффиксе. |
7.4 | Строковый литерал не должен назначаться объекту, если только тип объекта не является «указателем на сертифицированный char». |
Декларации и определения
Правило | Описание |
---|---|
8.1 | Типы должны быть четко указаны. |
8.2 | Типы функций должны быть в форме прототипа с именованными параметрами. |
8.3* | Во всех объявлениях объекта или функции должны использоваться одинаковые имена и типы классификаторов. |
8.4 | Совместимое объявление должно быть видно, когда определен объект или функция с внешним редактированием. |
8.5* | Внешний объект или функция объявляются один раз в одном и только в одном файле. |
8.6* | Идентификатор с внешним редактированием должен иметь только одно внешнее определение. |
8.7* | Функции и объекты не должны определяться с помощью внешних редактирований, если они указаны только в одном модуле преобразования. |
8.8 | The |
8.9* | Объект должен быть определен в возможности, если его идентификатор отображается только в одной функции. |
8.10 | Встроенная функция должна быть объявлена с |
8.11 | Когда массив с внешним редактированием объявлен, его размер должен быть явно задан. |
8.12 | В список перечислителя значение неявно заданной постоянной перечисления должно быть уникальным. |
8.14 | The |
Инициализация
Правило | Описание |
---|---|
9.2 | Инициализатор агрегата или объединения должен быть заключен в скобки. |
9.3 | Массивы не должны быть частично инициализированы. |
9.4 | Элемент объекта не должен быть инициализирован более одного раза. |
9.5 | Если для инициализации объекта массива используются назначенные инициализаторы, то размер массива должен задаваться явным образом. |
Модель Essential Type
Правило | Описание |
---|---|
10.1 | Операнды не должны быть несоответствующего типа. |
10.2 | Выражения по существу типа символов не должны использоваться ненадлежащим образом в операциях сложения и вычитания. |
10.3 | Значение выражения не присваивается объекту с более узким существенным типом или другой категории существенного типа. |
10.4 | Оба операнда оператора, в которых выполняются обычные арифметические преобразования, должны иметь одну и ту же категорию основных типов. |
10.5 | Значение выражения не должно быть приведено к неподходящему существенному типу. |
10.6 | Значение составного выражения не присваивается объекту с более широким существенным типом. |
10.7 | Если составное выражение используется в качестве одного операнда оператора, в котором выполняются обычные арифметические преобразования, то другой операнд не должен иметь более широкого существенного типа. |
10.8 | Значение составного выражения не должно относиться к другой категории основных типов или к более широкому типу основных элементов. |
Преобразование типа указателя
Правило | Описание |
---|---|
11.1 | Преобразование не должно выполняться между указателем на функцию и любым другим типом. |
11.2 | Преобразование не должно выполняться между указателем на неполный тип и любым другим типом. |
11.3 | Приведение не должно выполняться между указателем на тип объекта и указателем на другой тип объекта. |
11.4 | Преобразование не должно выполняться между указателем на объект и целым типом. |
11.5 | Преобразование не должно выполняться из указателя в пустой в указатель на объект. |
11.6 | Приведение не должно выполняться между указателем на пустоту и арифметическим типом. |
11.7 | Приведение не должно выполняться между указателем на объект и нецелочисленным арифметическим типом. |
11.8 | Отливка не должна удалять какую-либо несовпадающую или летучую проверку из типа, на который указывает указатель. |
11.9 | Макрос |
Выражения
Правило | Описание |
---|---|
12.1 | Приоритет операторов в выражениях должен быть явным. |
12.3 | Оператор запятыми не должен использоваться. |
12.4 | Оценка постоянных выражений не должна приводить к беззнаковому целочисленному переносу. |
Побочные эффекты
Правило | Описание |
---|---|
13.3 | Полное выражение, содержащее шаг ( |
13.4 | Результат оператора назначения не должен использоваться. |
13.6 | Операнд |
Выражения оператора управления
Правило | Описание |
---|---|
14.4 | Управляющее выражение |
Управляйте потоком
Правило | Описание |
---|---|
15.1 | The |
15.2 | The |
15.3 | Любая метка, на которую ссылается |
15.4 | Должно быть не более одного |
15.5 | Функция должна иметь одну точку выхода в конце |
15.6 | Тело итерации-оператора или селекции должно быть составным оператором. |
15.7 | Все |
Операторы Switch
Правило | Описание |
---|---|
16.1 | Все |
16.2 | A |
16.3 | Безусловное |
16.4 | Каждый |
16.5 | A |
16.6 | Каждый |
16.7 | A |
Функции
Правило | Описание |
---|---|
17.1 | Область функций |
17.3 | Функция не должна объявляться неявно. |
17.4 | Все выходные пути из функции с не- |
17.6 | Объявление параметра массива не должно содержать |
17.7 | Значение, возвращенное функцией, не имеющей |
Указатели и массивы
Правило | Описание |
---|---|
18.4 | The |
18.5 | Объявления должны содержать не более двух уровней вложенности указателей. |
18.7 | Гибкие представители массива не должны быть объявлены. |
18.8 | Типы массивов переменной длины не должны использоваться. |
Перекрывающееся хранилище
Правило | Описание |
---|---|
19.2 | The |
Директивы предварительной обработки
Правило | Описание |
---|---|
20.1 |
|
20.2 | The |
20.3 | The |
20.4 | Макрос не должен быть определен с таким же именем, как ключевое слово. |
20.5 |
|
20.6 | Лексемы, которые выглядят как директива предварительной обработки, не должны происходить в макро- аргумент. |
20.7 | Выражения, вытекающие из расширения макро- параметры, заключаются в круглые скобки. |
20.8 | Управляющее выражение |
20.9 | Все идентификаторы, используемые в управляющем выражении |
20.10 | The |
20.11 | Параметр макроса, непосредственно следующий за |
20.12 | Параметр макроса, используемый в качестве операнда к |
20.13 | A линии, чья первая лексема |
20.14 | Все |
Стандартные библиотеки
Правило | Описание |
---|---|
21.1 |
|
21.2 | Зарезервированный идентификатор или имя макроса не должны объявляться. |
21.3 | Функции выделения и отмены выделения памяти |
21.4 | Стандартный файл заголовка |
21.5 | Стандартный файл заголовка |
21.6 | Входные/выходные функции Стандартной библиотеки не должны использоваться. |
21.7 | The |
21.8 | Библиотека функционирует |
21.9 | Библиотека функционирует |
21.10 | Функции «Стандартное время и дата библиотеки» не должны использоваться. |
21.11 | Стандартный файл заголовка |
21.12 | Особые функции обработки исключений |
Правила, которые проверяются на уровень системы и появляются только в system-decidable-rules
подмножество обозначено звездочкой.
Check MISRA AC AGC (-misra-ac-agc)
| Check MISRA C:2004 (-misra2)
| Check MISRA C:2012 (-misra3)