Следующий набор правил кодирования MISRA ® C++ обычно увеличивает количество неподтвержденных результатов в Prover™ кода Polyspace ®.
Правило MISRA C++ | Описание |
|---|---|
| 2-10-2 | Идентификаторы, объявленные во внутренней области, не должны скрывать идентификатор, объявленный во внешней области. |
| 3-1-3 | При объявлении массива его размер должен быть указан явно или определен неявно при инициализации. |
| 3-3-2 | Правило единого определения не должно нарушаться. |
| 3-9-3 | Базовые битовые представления значений с плавающей запятой не должны использоваться. |
| 5-0-15 | Индексация массива должна быть единственной формой арифметики указателя. |
| 5-0-18 | >, > =, <, < = не должны применяться к объектам типа указателя, за исключением случаев, когда они указывают на один и тот же массив. |
| 5-0-19 | Объявление объектов должно содержать не более двух уровней косвенности указателя. |
| 5-2-8 | Объект с целым типом или указатель на тип void не должен преобразовываться в объект с типом указателя. |
| 5-2-9 | Приведение не должно преобразовывать тип указателя в интегральный тип. |
| 6-2-2 | Выражения с плавающей запятой не должны прямо или косвенно проверяться на равенство или неравенство. |
| 6-5-1 | Контур для шлейфа должен содержать один счетчик шлейфа, который не должен иметь плавающего типа. |
| 6-5-2 | Если счетчик цикла не изменяется на - или++, то в пределах условия счетчик цикла должен использоваться только в качестве операнда для < =, <, > или > =. |
| 6-5-3 | Счетчик контуров не должен изменяться в пределах условия или инструкции. |
| 6-5-4 | Счетчик контура должен быть изменен одним из: -, + +, - = n или + = n; где n остается постоянным в течение всего цикла. |
| 6-6-1 | Любая метка, на которую ссылается оператор goto, должна быть объявлена в том же блоке или в блоке, включающем оператор goto. |
| 6-6-2 | Оператор goto должен перейти к метке, объявленной позже в том же теле функции. |
| 6-6-4 | Для любого оператора итерации должно быть не более одного перерыва или оператора goto, используемого для завершения цикла. |
| 6-6-5 | Функция должна иметь единственную точку выхода в конце функции. |
| 7-5-1 | Функция не должна возвращать ссылку или указатель на автоматическую переменную (включая параметры), определенную в функции. |
| 7-5-2 | Адрес объекта с автоматическим хранением не должен присваиваться другому объекту, который может сохраняться после прекращения существования первого объекта. |
| 7-5-4 | Функции не должны называть себя прямо или косвенно. |
| 8-4-1 | Функции не должны определяться с помощью многоточия. |
| 9-5-1 | Профсоюзы не используются. |
| 10-1-2 | Базовый класс объявляется виртуальным только в том случае, если он используется в алмазной иерархии. |
| 10-1-3 | Доступный базовый класс не должен быть как виртуальным, так и невиртуальным в одной иерархии. |
| 10-3-1 | На каждом пути в иерархии наследования должно быть не более одного определения каждой виртуальной функции. |
| 10-3-2 | Каждая переопределяющая виртуальная функция должна быть объявлена с помощью ключевого слова virtual. |
| 10-3-3 | Виртуальная функция должна быть переопределена только чистой виртуальной функцией, если она сама объявлена чистой виртуальной. |
| 15-0-3 | Управление не должно передаваться в блок try или catch с помощью оператора goto или switch. |
| 15-1-3 | Пустой бросок (бросок;) должен использоваться только в компаундировании обработчика улова. |
| 15-3-3 | Обработчики реализации function-try-block конструктора класса или деструктора не должны ссылаться на нестатические элементы из этого класса или его баз. |
| 15-3-5 | Исключение типа класса всегда должно перехватываться по ссылке. |
| 15-3-6 | Если в одной инструкции try-catch или function-try-block предусмотрено несколько обработчиков для производного класса и некоторых или всех его баз, обработчики должны быть упорядочены наиболее производными для базового класса. |
| 15-3-7 | Если в одном операторе try-catch или function-try-block предусмотрено несколько обработчиков, любой обработчик многоточия (catch-all) должен быть последним. |
| 15-4-1 | Если функция объявлена со спецификацией исключения, то все объявления той же функции (в других единицах преобразования) должны быть объявлены с одним и тем же набором идентификаторов типов. |
| 15-5-1 | Деструктор класса не должен выходить за исключением. |
| 15-5-2 | Если объявление функции включает в себя спецификацию исключения, функция должна быть способна создавать исключения только указанного типа (типов). |
| 18-4-1 | Динамическое выделение памяти кучи не должно использоваться. |
Оптимальные методы проектирования обычно приводят к снижению сложности кода, что может улучшить количество недоказанных результатов в программе Polyspace Code Prover. Следующий набор правил кодирования может помочь решить проблемы проектирования в коде. SQO-subset2 опция проверяет правила в SQO-subset1 и SQO-subset2.
Правило MISRA C++ | Описание |
|---|---|
| 2-10-2 | Идентификаторы, объявленные во внутренней области, не должны скрывать идентификатор, объявленный во внешней области. |
| 3-1-3 | При объявлении массива его размер должен быть указан явно или определен неявно при инициализации. |
| 3-3-2 | Если функция имеет внутреннюю связь, то все повторные объявления должны включать спецификатор статического класса хранения. |
| 3-4-1 | Идентификатор, объявленный как объект или тип, должен быть определен в блоке, который минимизирует его видимость. |
| 3-9-2 | вместо базовых числовых типов следует использовать типоразмеры, указывающие на размер и заметность. |
| 3-9-3 | Базовые битовые представления значений с плавающей запятой не должны использоваться. |
| 4-5-1 | Выражения с типом bool не должны использоваться в качестве операндов для встроенных операторов, кроме оператора назначения =, логических операторов & &, |,!, операторов равенства = и! =, унарного & оператора и условного оператора. |
| 5-0-1 | Значение выражения должно быть одинаковым при любом порядке оценки, разрешенном стандартом. |
| 5-0-2 | Ограниченная зависимость от правил приоритета оператора C++ в выражениях. |
| 5-0-7 | Не должно быть явных плавающих-интегральных преобразований выражения cvalue. |
| 5-0-8 | Явное интегральное преобразование или преобразование с плавающей запятой не должно увеличивать размер базового типа выражения cvalue. |
| 5-0-9 | Явное интегральное преобразование не должно изменять сигнатуру базового типа выражения значения. |
| 5-0-10 | Если побитовые операторы ~ и < < применяются к операнду с нижележащим типом неподписанного символа или неподписанным коротким, результат должен быть немедленно приведен к нижележащему типу операнда. |
| 5-0-13 | Условие if-оператора и условие iteration- оператора должны иметь тип bool |
| 5-0-15 | Индексация массива должна быть единственной формой арифметики указателя. |
| 5-0-18 | >, > =, <, < = не должны применяться к объектам типа указателя, за исключением случаев, когда они указывают на один и тот же массив. |
| 5-0-19 | Объявление объектов должно содержать не более двух уровней косвенности указателя. |
| 5-2-1 | Каждый операнд логического & & или | | должен быть постфиксным - выражением. |
| 5-2-2 | Указатель на виртуальный базовый класс должен приводиться только к указателю на производный класс посредством dynamic_cast. |
| 5-2-5 | Отливка не должна исключать никаких противоречий или изменчивых квалификаций из типа указателя или ссылки. |
| 5-2-6 | Приведение не должно преобразовывать указатель на функцию в любой другой тип указателя, включая указатель на тип функции. |
| 5-2-7 | Объект с типом указателя не должен прямо или косвенно преобразовываться в несвязанный тип указателя. |
| 5-2-8 | Объект с целым типом или указатель на тип void не должен преобразовываться в объект с типом указателя. |
| 5-2-9 | Приведение не должно преобразовывать тип указателя в интегральный тип. |
| 5-2-11 | Оператор запятой & & и оператор | | не должны перегружаться. |
| 5-3-2 | Оператор «унарный минус» не применяется к выражению, базовый тип которого не подписан. |
| 5-3-3 | Унарный и оператор не должны перегружаться. |
| 5-18-1 | Оператор запятой не используется. |
| 6-2-1 | Операторы назначения не должны использоваться в подвыражениях. |
| 6-2-2 | Выражения с плавающей запятой не должны прямо или косвенно проверяться на равенство или неравенство. |
| 6-3-1 | Утверждение, образующее тело переключателя, в то время как, делать... в то время как или для оператора должно быть составным оператором. |
| 6-4-2 | Все, если... в противном случае, если конструкции должны быть прекращены пунктом else. |
| 6-4-6 | Заключительным пунктом инструкции по переключению является пункт по умолчанию. |
| 6-5-1 | Контур для шлейфа должен содержать один счетчик шлейфа, который не должен иметь плавающего типа. |
| 6-5-2 | Если счетчик цикла не изменяется на - или++, то в пределах условия счетчик цикла должен использоваться только в качестве операнда для < =, <, > или > =. |
| 6-5-3 | Счетчик контуров не должен изменяться в пределах условия или инструкции. |
| 6-5-4 | Счетчик контура должен быть изменен одним из: -, + +, - = n или + = n; где n остается постоянным в течение всего цикла. |
| 6-6-1 | Любая метка, на которую ссылается оператор goto, должна быть объявлена в том же блоке или в блоке, включающем оператор goto. |
| 6-6-2 | Оператор goto должен перейти к метке, объявленной позже в том же теле функции. |
| 6-6-4 | Для любого оператора итерации должно быть не более одного перерыва или оператора goto, используемого для завершения цикла. |
| 6-6-5 | Функция должна иметь единственную точку выхода в конце функции. |
| 7-5-1 | Функция не должна возвращать ссылку или указатель на автоматическую переменную (включая параметры), определенную в функции. |
| 7-5-2 | Адрес объекта с автоматическим хранением не должен присваиваться другому объекту, который может сохраняться после прекращения существования первого объекта. |
| 7-5-4 | Функции не должны называть себя прямо или косвенно. |
| 8-4-1 | Функции не должны определяться с помощью многоточия. |
| 8-4-3 | Все пути выхода из функции с типом возврата non-void должны иметь явную инструкцию return с выражением. |
| 8-4-4 | Идентификатор функции должен использоваться либо для вызова функции, либо ему должен предшествовать &. |
| 8-5-2 | Фигурные скобки должны использоваться для указания и согласования структуры при ненулевой инициализации массивов и структур. |
| 8-5-3 | В списке перечислителей конструкция = не должна использоваться для явной инициализации элементов, отличных от первого, если только все элементы не инициализированы явным образом. |
| 9-5-1 | Профсоюзы не используются. |
| 10-1-2 | Базовый класс объявляется виртуальным только в том случае, если он используется в алмазной иерархии. |
| 10-1-3 | Доступный базовый класс не должен быть как виртуальным, так и невиртуальным в одной иерархии. |
| 10-3-1 | На каждом пути в иерархии наследования должно быть не более одного определения каждой виртуальной функции. |
| 10-3-2 | Каждая переопределяющая виртуальная функция должна быть объявлена с помощью ключевого слова virtual. |
| 10-3-3 | Виртуальная функция должна быть переопределена только чистой виртуальной функцией, если она сама объявлена чистой виртуальной. |
| 11-0-1 | Данные элементов в классах, отличных от POD, должны быть закрытыми. |
| 12-1-1 | Динамический тип объекта не должен использоваться из тела его конструктора или деструктора. |
| 12-8-2 | Оператор присвоения копий объявляется защищенным или частным в абстрактном классе. |
| 15-0-3 | Управление не должно передаваться в блок try или catch с помощью оператора goto или switch. |
| 15-1-3 | Пустой бросок (бросок;) должен использоваться только в компаундировании обработчика улова. |
| 15-3-3 | Обработчики реализации function-try-block конструктора класса или деструктора не должны ссылаться на нестатические элементы из этого класса или его баз. |
| 15-3-5 | Исключение типа класса всегда должно перехватываться по ссылке. |
| 15-3-6 | Если в одной инструкции try-catch или function-try-block предусмотрено несколько обработчиков для производного класса и некоторых или всех его баз, обработчики должны быть упорядочены наиболее производными для базового класса. |
| 15-3-7 | Если в одном операторе try-catch или function-try-block предусмотрено несколько обработчиков, любой обработчик многоточия (catch-all) должен быть последним. |
| 15-4-1 | Если функция объявлена со спецификацией исключения, то все объявления той же функции (в других единицах преобразования) должны быть объявлены с одним и тем же набором идентификаторов типов. |
| 15-5-1 | Деструктор класса не должен выходить за исключением. |
| 15-5-2 | Если объявление функции включает в себя спецификацию исключения, функция должна быть способна создавать исключения только указанного типа (типов). |
| 16-0-5 | Аргументы для функционально-подобного макроса не должны содержать маркеры, похожие на директивы предварительной обработки. |
| 16-0-6 | В определении функционального макроса каждый экземпляр параметра должен быть заключен в круглые скобки, если только он не используется в качестве операнда # или # #. |
| 16-0-7 | Неопределенные идентификаторы макросов не должны использоваться в директивах препроцессора # if или # elif, за исключением операндов для определенного оператора. |
| 16-2-2 | Макросы C++ должны использоваться только для защиты, квалификаторов типа или спецификаторов класса хранения. |
| 16-3-1 | В одном определении макроса должно присутствовать не более одного вхождения операторов # или # #. |
| 18-4-1 | Динамическое выделение памяти кучи не должно использоваться. |
Check MISRA C++:2008 (-misra-cpp)