Целевые подмножества качества программного обеспечения (C++)

SQO Subset 1 - Прямое влияние на селективность

Следующий набор 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Динамическое выделение памяти «куча» не должно использоваться.

SQO Subset 2 - Косвенное влияние на селективность

Хорошие методы проекта обычно приводят к меньшей сложности кода, что может улучшить количество недоказанных результатов в 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Динамическое выделение памяти «куча» не должно использоваться.

См. также

Похожие темы