На начальном этапе компиляции анализа 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 | Тип простого символа должен использоваться только для хранения и использования символьных значений. |
| 6.2 | Подписанный и неподписанный тип символа должен использоваться только для хранения и использования числовых значений. |
| 6.3 |
|
| 6.4 | Битовые поля должны быть определены только типа |
| 6.5 | Битовые поля типа |
Константы
| Правило | Описание |
|---|---|
| 7.1 | Восьмеричные константы (отличные от нуля) и восьмеричные escape-последовательности не используются. |
Объявления и определения
| Правило | Описание |
|---|---|
| 8.1 | Функции должны иметь объявления прототипов, и прототипы должны быть видны как при определении функции, так и при вызове. |
| 8.2 | Каждый раз, когда объект или функция объявляется или определяется, ее тип должен быть явно указан. |
| 8.3 | Для каждого параметра функции тип, указанный в описании и определении, должен быть идентичным, а возвращаемые типы - идентичными. |
| 8.4* | Если объекты или функции объявляются более одного раза, их типы должны быть совместимыми. |
| 8.5 | В файле заголовка не должно быть определений объектов или функций. |
| 8.6 | Функции всегда должны быть объявлены в объеме файла. |
| 8.7 | Объекты должны быть определены в объеме блока, если доступ к ним осуществляется только из одной функции. |
| 8.8* | Внешний объект или функция должны быть объявлены в одном файле и только в одном файле. |
| 8.9* | Идентификатор с внешней связью должен иметь ровно одно внешнее определение. |
| 8.10* | Все объявления и определения объектов или функций в объеме файла должны иметь внутреннюю связь, если не требуется внешняя связь. |
| 8.11 | |
| 8.12 | Когда массив объявлен с внешней связью, его размер должен быть указан явно или определен неявно при инициализации. |
Инициализация
| Правило | Описание |
|---|---|
| 9.2 | Фигурные скобки должны использоваться для указания и согласования структуры при ненулевой инициализации массивов и структур. |
| 9.3 | В списке перечислителей |
Преобразование арифметических типов
| Правило | Описание |
|---|---|
| 10.1 | Значение выражения целого типа не должно быть неявно преобразовано в другой базовый тип, если:
|
| 10.2 | Значение выражения плавающего типа не должно быть неявно преобразовано в другой тип, если
|
| 10.3 | Значение комплексного выражения целочисленного типа может быть приведено только к типу, который является более узким и имеет ту же сигнатуру, что и базовый тип выражения. |
| 10.4 | Значение комплексного выражения типа float может быть приведено только к более узкому плавающему типу. |
| 10.5 | Если побитовый оператор |
| 10.6 | Суффикс «U» применяется ко всем константам |
Преобразование типа указателя
| Правило | Описание |
|---|---|
| 11.1 | Преобразование не должно выполняться между указателем на функцию и любым типом, отличным от интегрального типа. |
| 11.2 | Преобразование не должно выполняться между указателем на объект и любым типом, отличным от интегрального типа, другим указателем на тип объекта или указателем на |
| 11.3 | Приведение не должно выполняться между типом указателя и интегральным типом. |
| 11.4 | Приведение не должно выполняться между указателем на тип объекта и другим указателем на тип объекта. |
| 11.5 | Не должен выполняться кастинг, который удаляет |
Выражения
| Правило | Описание |
|---|---|
| 12.1 | Ограниченная зависимость должна быть от правил приоритета оператора C в выражениях. |
| 12.3 | |
| 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 | Все операторы, отличные от NULL, должны либо
|
| 14.4 | |
| 14.5 | |
| 14.6 | Для любого оператора итерации должно быть не более одного |
| 14.7 | Функция должна иметь единственную точку выхода в конце функции. |
| 14.8 | Утверждение, образующее тело |
| 14.9 | Один |
| 14.10 | Все |
Операторы переключения
| Правило | Описание |
|---|---|
| 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 | |
| 19.4 | Макросы C должны расширяться только до инициализатора с скобками, константы, выражения в скобках, квалификатора типа, спецификатора класса хранения или конструкции do-while-zero. |
| 19.5 | Макросы не должны быть |
| 19.6 |
|
| 19.7 | Функция должна использоваться вместо функции типа-макро. |
| 19.8 | Функциональный макрос не должен вызываться без всех его аргументов. |
| 19.9 | Аргументы для функционально-подобного макроса не должны содержать маркеры, похожие на директивы предварительной обработки. |
| 19.10 | При определении функционального макроса каждый экземпляр параметра должен быть заключен в круглые скобки, если только он не используется в качестве операнда |
| 19.11 | Все идентификаторы макросов в директивах препроцессора должны быть определены перед использованием, за исключением |
| 19.12 | Должно быть не более одного случая |
| 19.13 | |
| 19.14 | Определенный оператор препроцессора должен использоваться только в одной из двух стандартных форм. |
| 19.15 | Необходимо принять меры предосторожности для предотвращения двойного включения содержимого файла заголовка. |
| 19.16 | Директивы предварительной обработки должны быть синтаксически значимыми, даже если они исключены препроцессором. |
| 19.17 | Все |
Стандартные библиотеки
| Правило | Описание |
|---|---|
| 20.1 | Зарезервированные идентификаторы, макросы и функции в стандартной библиотеке не должны быть определены, переопределены или не определены. |
| 20.2 | Имена стандартных библиотечных макросов, объектов и функций не должны использоваться повторно. |
| 20.4 | Динамическое выделение памяти кучи не должно использоваться. |
| 20.5 | Индикатор ошибки |
| 20.6 | Макрос |
| 20.7 | |
| 20.8 | Средства обработки сигналов |
| 20.9 | Библиотека ввода/вывода |
| 20.10 | Функции библиотеки |
| 20.11 | Функции библиотеки |
| 20.12 | Функции обработки времени библиотеки |
Правила, которые проверяются на системном уровне и отображаются только в system-decidable-rules подмножество обозначено звездочкой.
На ранних этапах анализа программное обеспечение проверяет следующие правила. Правила, которые проверяются на системном уровне и отображаются только в system-decidable-rules подмножество обозначено звездочкой.
Стандартная среда C
| Правило | Описание |
|---|---|
| 1.1 | Программа не должна содержать нарушений стандартного синтаксиса и ограничений Си и не должна превышать предельных значений перевода реализации. |
| 1.2 | Расширения языка не должны использоваться. |
Неиспользуемый код
| Правило | Описание |
|---|---|
| 2.3* | Проект не должен содержать неиспользуемые объявления типов. |
| 2.4* | Проект не должен содержать неиспользуемые объявления тегов. |
| 2.5* | Проект не должен содержать неиспользуемые макро-объявления. |
| 2.6 | Функция не должна содержать неиспользуемые объявления меток. |
| 2.7 | В функциях не должно быть неиспользуемых параметров. |
Комментарии
| Правило | Описание |
|---|---|
| 3.1 | Последовательности символов |
| 3.2 | Сращивание линий не должно использоваться в |
Наборы символов и лексические условные обозначения
| Правило | Описание |
|---|---|
| 4.1 | Восьмеричная и шестнадцатеричная escape-последовательности должны быть прекращены. |
| 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 | Строковый литерал не должен назначаться объекту, если тип объекта не является «указателем на условный символ». |
Объявления и определения
| Правило | Описание |
|---|---|
| 8.1 | Типы должны быть четко указаны. |
| 8.2 | Типы функций должны быть в виде прототипа с названными параметрами. |
| 8.3* | Все объявления объекта или функции должны использовать одинаковые имена и квалификаторы типов. |
| 8.4 | Совместимое объявление должно быть видимым при определении объекта или функции с внешней связью. |
| 8.5* | Внешний объект или функция объявляются один раз в одном и только в одном файле. |
| 8.6* | Идентификатор с внешней связью должен иметь ровно одно внешнее определение. |
| 8.7* | Функции и объекты не должны определяться с внешней связью, если на них имеются ссылки только в одной единице перевода. |
| 8.8 | |
| 8.9* | Объект должен быть определен в области действия блока, если его идентификатор отображается только в одной функции. |
| 8.10 | Встроенная функция должна быть объявлена с помощью |
| 8.11 | При объявлении массива с внешней связью его размер должен быть указан явным образом. |
| 8.12 | В списке перечислителей значение неявно указанной константы перечисления должно быть уникальным. |
| 8.14 | |
Инициализация
| Правило | Описание |
|---|---|
| 9.2 | Инициализатор агрегата или соединения должен быть заключен в скобки. |
| 9.3 | Не допускается частичная инициализация массивов. |
| 9.4 | Элемент объекта не должен инициализироваться более одного раза. |
| 9.5 | Если для инициализации объекта массива используются назначенные инициализаторы, размер массива должен быть указан явным образом. |
Модель основного типа
| Правило | Описание |
|---|---|
| 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 | |
| 15.2 | |
| 15.3 | Любая метка, на которую ссылается |
| 15.4 | Должно быть не более одного |
| 15.5 | Функция должна иметь единственную точку выхода в конце |
| 15.6 | Тело итерационного оператора или оператора выбора должно быть составным оператором. |
| 15.7 | Все |
Операторы переключения
| Правило | Описание |
|---|---|
| 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 | |
| 18.5 | Объявления должны содержать не более двух уровней вложенности указателей. |
| 18.7 | Элементы гибкого массива не объявляются. |
| 18.8 | Типы массивов переменной длины не должны использоваться. |
Перекрывающееся хранилище
| Правило | Описание |
|---|---|
| 19.2 | |
Директивы предварительной обработки
| Правило | Описание |
|---|---|
| 20.1 |
|
| 20.2 | |
| 20.3 | |
| 20.4 | Макрос не должен быть определен с тем же именем, что и ключевое слово. |
| 20.5 |
|
| 20.6 | Маркеры, похожие на директиву предварительной обработки, не должны появляться в аргументе макроса. |
| 20.7 | Выражения, возникающие в результате расширения параметров макроса, должны быть заключены в круглые скобки. |
| 20.8 | Управляющее выражение |
| 20.9 | Все идентификаторы, используемые в управляющем выражении |
| 20.10 | |
| 20.11 | Параметр макроса, непосредственно следующий за |
| 20.12 | Параметр макроса, используемый в качестве операнда для |
| 20.13 | Строка, первым маркером которой является |
| 20.14 | Все |
Стандартные библиотеки
| Правило | Описание |
|---|---|
| 21.1 |
|
| 21.2 | Зарезервированный идентификатор или имя макроса объявляться не должны. |
| 21.3 | Функции выделения и освобождения памяти |
| 21.4 | Стандартный файл заголовка |
| 21.5 | Стандартный файл заголовка |
| 21.6 | Функции ввода/вывода стандартной библиотеки не используются. |
| 21.7 | |
| 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)