exponenta event banner

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

Подмножество 1 SQO - Прямое влияние на избирательность

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

Подмножество 2 SQO - Косвенное влияние на избирательность

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

См. также

Связанные темы