Следующий набор MISRA® Правила кодирования C++ обычно улучшают количество недоказанных результатов в Polyspace® Code Prover™.
Правило 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 | Цикл for должен содержать один контур-счетчик, который не должен иметь плавающего типа. |
6-5-2 | Если счетчик цикла не изменяется -- или++, то в пределах условия счетчик цикла должен использоваться только в качестве операнда на < =, <, > или > =. |
6-5-3 | Счетчик контура не должен изменяться в пределах условия или оператора. |
6-5-4 | Счетчик цикла должен быть изменен одним из: --, + +, - = n или + = n; где n остается постоянным для длительности цикла. |
6-6-1 | Любая метка, на которую ссылается оператор goto, должна быть объявлена в том же блоке или в блоке, содержащем оператор goto. |
6-6-2 | Оператор goto должен перейти к метке, объявленной позже в том же теле функции. |
6-6-4 | Для любого оператора итерации должно быть не более одного оператора break или 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 | Каждая переопределяющая виртуальная функция должна быть объявлена с помощью виртуального ключевого слова. |
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-блоке для производного класса и некоторых или всех его основ, обработчики должны быть упорядочены до базового класса. |
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. Следующий набор правил кодирования может помочь решить проблемы проекта в вашем коде. The 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 | Явное интегральное преобразование не должно изменять сигнальность базового типа выражения cvalue. |
5-0-10 | Если побитовые операторы ~ и < < применяются к операнду с базовым типом беззнакового char или беззнакового шорт, результат должен быть немедленно приведен к базовому типу операнда. |
5-0-13 | Состояние оператора if и состояние итерация- оператор должно иметь тип 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 | Все, если... иное, если конструкции должны быть прекращены в соответствии с пунктом об ином. |
6-4-6 | Конечным пунктом оператора switch является положение по умолчанию. |
6-5-1 | Цикл for должен содержать один контур-счетчик, который не должен иметь плавающего типа. |
6-5-2 | Если счетчик цикла не изменяется -- или++, то в пределах условия счетчик цикла должен использоваться только в качестве операнда на < =, <, > или > =. |
6-5-3 | Счетчик контура не должен изменяться в пределах условия или оператора. |
6-5-4 | Счетчик цикла должен быть изменен одним из: --, + +, - = n или + = n; где n остается постоянным для длительности цикла. |
6-6-1 | Любая метка, на которую ссылается оператор goto, должна быть объявлена в том же блоке или в блоке, содержащем оператор goto. |
6-6-2 | Оператор goto должен перейти к метке, объявленной позже в том же теле функции. |
6-6-4 | Для любого оператора итерации должно быть не более одного оператора break или goto, используемого для завершения цикла. |
6-6-5 | Функция должна иметь одну точку выхода в конце функции. |
7-5-1 | Функция не должна возвращать ссылку или указатель на автоматическую переменную (включая параметры), заданную в функции. |
7-5-2 | Адрес объекта с автоматическим хранением не должен быть присвоен другому объекту, который может сохраняться после прекращения существования первого объекта. |
7-5-4 | Функции не должны вызывать себя, прямо или косвенно. |
8-4-1 | Функции не должны определяться с помощью обозначения эллипсиса. |
8-4-3 | Все выходные пути из функции с непустым типом возврата должны иметь явный оператор возврата с выражением. |
8-4-4 | Идентификатор функции должен либо использоваться для вызова функции, либо ему должны предшествовать &. |
8-5-2 | Скобки должны использоваться для указания и соответствия структуры в ненулевой инициализации массивов и структур. |
8-5-3 | В списке перечислителей конструкция = не должна использоваться для явной инициализации представителей, отличных от первой, если только все элементы не инициализированы явным образом. |
9-5-1 | Объединения не должны использоваться. |
10-1-2 | Базовый класс должен быть объявлен виртуальным, только если он используется в иерархии алмазов. |
10-1-3 | Доступный базовый класс не должен быть одновременно виртуальным и невиртуальным в одной иерархии. |
10-3-1 | Не должно быть более одного определения каждой виртуальной функции на каждом пути через иерархию наследования. |
10-3-2 | Каждая переопределяющая виртуальная функция должна быть объявлена с помощью виртуального ключевого слова. |
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-блоке для производного класса и некоторых или всех его основ, обработчики должны быть упорядочены до базового класса. |
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)