В режиме быстрого анализа Bug Finder проверяет только подмножество дефектов и правил кодирования. В приведенных ниже таблицах перечислены результаты, которые можно найти в быстром анализе. См. также Use fast analysis mode for Bug Finder (-fast-analysis)
.
Эти дефекты и стандартные нарушения кодирования либо обнаруживаются ранее в анализе, либо используют архивную информацию предыдущего анализа. Результаты анализа сравнительно легче просмотреть и исправить, потому что большинство результатов можно понять, сосредоточившись на двух или трех строках кода (линия с дефектом и одна или две предыдущие линии).
Из-за упрощенного характера анализа вы можете увидеть меньше дефектов в режиме быстрого анализа по сравнению с регулярным анализом Bug Finder.
Статическая память
Имя | Описание |
---|---|
Переполнение буфера из неправильного спецификатора строкового формата ( str_format_buffer_overflow ) | Спецификатор строкового формата заставляет буферный аргумент стандартных библиотечных функций переполняться |
Ненадежное приведение указателя на функцию ( func_cast ) | Указатель на функцию приведен к другому указателю на функцию с другим аргументом или возвращаемым типом |
Ненадежное приведение указателя мыши ( ptr_cast ) | Указатель неявно приведен к различным типам данных |
Программирование
Имя | Описание |
---|---|
Копия перекрывающейся памяти ( overlapping_copy ) | Исходный и целевой аргументы функции копирования имеют перекрывающуюся память |
Исключение получено значением ( excp_caught_by_value ) |
|
Обработчик исключений, скрытый предыдущим обработчиком ( excp_handler_hidden ) |
|
Формат форматирования спецификаторов строк и аргументов ( string_format ) | Спецификаторы строк не совпадают с соответствующими аргументами |
Неправильная инициализация массива ( improper_array_init ) | Неправильная инициализация массива при использовании инициализаторов |
Недопустимое использование оператора = = (равенство) ( bad_equal_equal_use ) | Операция равенства в операторе о присвоении |
Недопустимое использование оператора = (назначение) ( bad_equal_use ) | Назначение в условном операторе |
Недопустимое использование операции с плавающей точкой ( bad_float_op ) | Неточное сравнение переменных с плавающей точкой |
Отсутствует значение null в строковые массивы ( missing_null_char ) | Строка не заканчивается символом null |
Перекрывающееся назначение ( overlapping_assign ) | Перекрытие памяти между левой и правой сторонами назначения |
Возможно, непреднамеренная оценка выражения из-за правил приоритета оператора ( operator_precedence ) | Правила приоритета операторов вызывают неожиданный порядок оценки в арифметическом выражении |
Небезопасное преобразование между указателем и целым числом ( bad_int_ptr_cast ) | Несогласованные или недопустимые результаты преобразований между указателем мыши и целых типов |
Неправильный тип, используемый в sizeof ( ptr_sizeof_mismatch ) |
|
Поток данных
Имя | Описание |
---|---|
Код деактивирован постоянным ложным условием ( deactivated_code ) | Сегмент кода деактивирован |
Отсутствует оператор возврата ( missing_return ) | Функция не возвращает значение, хотя возвращаемый тип не является пустым |
Статическая незакрытая функция ( uncalled_func ) | Функция со статическими возможностями вызывается в файле |
Переменная затенение ( var_shadowing ) | Переменная скрывает другую переменную с таким же именем с вложенной возможностями |
Объектно-ориентированный
Имя | Описание |
---|---|
*this не возвращен в операторе назначения копии( return_not_ref_to_this ) | оператор = method не возвращает указатель на текущий объект |
Оператор назначения базового класса не вызывается ( missing_base_assign_op_call ) | Оператор назначения копирования не вызывает операторов назначения копирования базовых подобъектов |
Деструктор базового класса не виртуальный ( dtor_not_virtual ) | Класс не может вести себя полиморфно для удаления производных объектов классов |
Копируйте конструктор, не вызванный в списке инициализации ( missing_copy_ctor_call ) | Конструктор копирования не вызывает конструкторы копирования некоторых представителей или базовых классов |
Несовместимые типы предотвращают переопределение ( virtual_func_hiding ) | Метод производного класса скрывает метод виртуального базового класса вместо того, чтобы переопределять его |
Представитель не инициализирован в конструкторе ( non_init_member ) | Конструктор не инициализирует некоторые представители класса |
Отсутствует явное ключевое слово ( missing_explicit_keyword ) | Конструктор пропускает явный спецификатор |
Отсутствует виртуальное наследство ( missing_virtual_inheritance ) | Базовый класс наследуется виртуально и невиртуально в одной иерархии |
Разрезание объектов ( object_slicing ) | Производный объект класса передан значением, чтобы функционировать с параметром базового класса |
Частичное переопределение перегруженных виртуальных функций ( partial_override ) | Класс переопределяет долю унаследованных виртуальных функций с заданным именем |
Возврат указателя non const к инкапсулированному представителю данных ( breaking_data_encapsulation ) | Метод возвращает указатель или ссылку на внутренний представитель объекта |
Самоопределение, не протестированное в операторе ( missing_self_assign_test ) | Оператор назначения копирования не проверяет на самоопределение |
Безопасность
Имя | Описание |
---|---|
Указатель на функцию, назначенный с абсолютным адресом ( func_ptr_absolute_addr ) | Постоянное выражение используется, поскольку адрес функции уязвим для инъекции кода |
Передовая практика
Имя | Описание |
---|---|
Битовая и арифметическая операция на тех же данных ( bitwise_arith_mix ) | Оператор со смешанными побитовыми и арифметическими операциями |
Удаление пустого указателя ( delete_of_void_ptr ) | delete работает с |
Жестко закодированный buffer size ( hard_coded_buffer_size ) | Размер буфера памяти является числовым значением вместо символьной константы |
Жестко закодированная граница цикла ( hard_coded_loop_boundary ) | Граница цикла является числовым значением вместо символьной константы |
Большой аргумент pass-by-value ( pass_by_value ) | Большой аргумент передан значением между функциями |
Линия с несколькими операторами ( more_than_one_statement ) | Несколько операторы в линии |
Отсутствие пропуска в корпусе переключателя ( missing_switch_break ) | Без комментариев в конце варианта switch без оператора break |
Отсутствует сброс свободного указателя мыши ( missing_freed_ptr_reset ) | Указатель свободен, не сопровождается оператором сброса, чтобы удалить оставшиеся данные |
Неиспользованный параметр ( unused_parameter ) | Прототип функции имеет параметры, не считанные или записанные в тело функции |
Программа проверяет следующие правила в начале анализа.
Языковые расширения
Правило | Описание |
---|---|
2.1 | Язык сборки должен быть инкапсулирован и изолирован. |
2.2 | Исходный код должен использовать только |
2.3 | Последовательность символов |
Документация
Правило | Описание |
---|---|
3.4 | Все виды использования |
Наборы символов
Правило | Описание |
---|---|
4.1 | Должны использоваться только те эвакуационные последовательности, которые определены в стандарте ISO C. |
4.2 | Триграфы не должны использоваться. |
Идентификаторы
Правило | Описание |
---|---|
5.2 | Идентификаторы во внутренних возможностях не должны использовать то же имя, что и идентификаторы во внешних возможностях, и поэтому скрывать этот идентификатор. |
Типы
Правило | Описание |
---|---|
6.1 | Обычный тип char должен использоваться только для хранения и использования значений символов. |
6.2 | Подписанный и беззнаковый тип char должен использоваться только для хранения и использования числовых значений. |
6.3 |
|
6.4 | Битовые поля должны быть определены только для типа |
6.5 | Битовые поля типа |
Константы
Правило | Описание |
---|---|
7.1 | Восьмеричные константы (кроме нуля) и восьмеричные выходные последовательности не должны использоваться. |
Декларации и определения
Правило | Описание |
---|---|
8.1 | Функции должны иметь объявления прототипа, и прототип должен быть виден как при определении функции, так и при вызове. |
8.2 | Всякий раз, когда объект или функция объявлены или определены, его тип четко указывается. |
8.3 | Для каждого функционального параметра тип, указанный в декларации и определении, должен быть идентичным, а типы возврата должны также совпадать. |
8.5 | В заголовочном файле не должно быть определений объектов или функций. |
8.6 | Функции должны всегда объявляться в возможностях файла. |
8.7 | Объекты должны быть определены в возможности, если они доступны только из одной функции. |
8.8 |
Внешний объект или функция должны быть объявлены в одном файле и только в одном файле. |
8.9 |
Идентификатор с внешним редактированием должен иметь только одно внешнее определение. |
8.11 | The |
8.12 | Когда массив объявлен с внешним редактированием, его размер должен быть указан явным или неявным образом путем инициализации. |
Инициализация
Правило | Описание |
---|---|
9.2 | Скобки должны использоваться для указания и соответствия структуры в ненулевой инициализации массивов и структур. |
9.3 | В списке перечислителей |
Преобразование арифметического типа
Правило | Описание |
---|---|
10.1 | Значение выражения целого типа не должно неявно преобразовываться в другой базовый тип, если:
|
10.2 | Значение выражения плавающего типа не должно неявно преобразовываться в другой тип, если
|
10.3 | Значение комплексного выражения целого типа может быть приведено только к типу, который является более узким и имеет ту же сигнальность, что и базовый тип выражения. |
10.4 | Значение комплексного выражения типа с плавающей точкой может быть приведено только к более узкому плавающему типу. |
10.5 | Если побитовый оператор |
10.6 | Суффикс «U» применяется ко всем константам |
Преобразование типа указателя
Правило | Описание |
---|---|
11.1 | Преобразование не должно выполняться между указателем на функцию и любым типом, отличным от интегрального типа. |
11.2 | Преобразование не должно выполняться между указателем на объект и любым типом, отличным от интегрального типа, другим указателем на тип объекта или указателем на |
11.3 | Приведение не должно выполняться между типом указателя и интегральным типом. |
11.4 | Приведение не должно выполняться между указателем на тип объекта и другим указателем на тип объекта. |
11.5 | Отливка не должна выполняться, чтобы удалить какие-либо |
Выражения
Правило | Описание |
---|---|
12.1 | Ограниченная зависимость должна быть помещена в выражения в правилах приоритета операторов С. |
12.3 | The |
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 | Все операторы без нуля должны либо
|
14.4 | The |
14.5 | The |
14.6 | Для любого оператора итерации должно быть самое большее одно |
14.7 | Функция должна иметь одну точку выхода в конце функции. |
14.8 | Оператор, образующее тело |
14.9 | Система координат |
14.10 | Все |
Операторы Switch
Правило | Описание |
---|---|
15.0 | Между |
15.1 | A |
15.2 | Безусловное |
15.3 | Окончательный пункт |
15.4 | A |
15.5 | Каждый |
Функции
Правило | Описание |
---|---|
16.1 | Функции не должны определяться переменным числом аргументов. |
16.3 | Идентификаторы должны быть даны для всех параметров в объявлении прототипа функции. |
16.5 | Функции без параметров должны быть объявлены с типом параметра |
16.6 | Количество аргументов, переданных функции, должно совпадать с количеством параметров. |
16.8 | Все выходные пути из функции с не- |
16.9 | Идентификатор функции должен использоваться только с предыдущим |
Указатели и массивы
Правило | Описание |
---|---|
17.4 | Индексация массива должна быть единственно допустимой формой арифметики указателя. |
17.5 | Тип не должен содержать более 2 уровней опосредования указателя. |
Структуры и объединения
Правило | Описание |
---|---|
18.1 | Все типы конструкций или объединений должны быть завершены в конце модуля перевода. |
18.4 | Объединения не должны использоваться. |
Директивы предварительной обработки
Правило | Описание |
---|---|
19.1 |
|
19.2 | Нестандартные символы не должны встречаться в именах заголовочных файлов в |
19.3 | The |
19.4 | Макросы C должны расширяться только на инициализатор скобок, константу, выражение в круглых скобках, квалификатор типа, спецификатор класса памяти или конструкцию нуль. |
19.5 | Макросы не должны быть |
19.6 |
|
19.7 | Функция должна использоваться в выборе функции, подобной макросу. |
19.8 | Функциональный макрос не должен вызываться без всех его аргументов. |
19.9 | Аргументы в функциональный макрос не должны содержать лексемы, которые выглядят как директивы предварительной обработки. |
19.10 | В определении функционального макроса каждый образец параметра должен быть заключен в круглые скобки, если он не используется в качестве операнда |
19.11 | Все идентификаторы макросов в директивах препроцессора должны быть определены перед использованием, кроме |
19.12 | Должно быть самое большее одно вхождение |
19.13 | The |
19.14 | Определенный оператор препроцессора должен использоваться только в одной из двух стандартных форм. |
19.15 | Необходимо принять меры предосторожности, порядок предотвратить включение содержимого файла заголовка дважды. |
19.16 | Директивы предварительной обработки должны быть синтаксически значимыми, даже если исключены препроцессором. |
19.17 | Все |
Стандартные библиотеки
Правило | Описание |
---|---|
20.1 | Зарезервированные идентификаторы, макросы и функции в стандартной библиотеке не должны быть определены, переопределены или неопределены. |
20.2 | Имена стандартных библиотечных макросов, объектов и функций не должны использоваться повторно. |
20.4 | Динамическое выделение памяти «куча» не должно использоваться. |
20.5 | Индикатор ошибки |
20.6 | Макрос |
20.7 | The |
20.8 | Средства обработки сигналов |
20.9 | Библиотека ввода/вывода |
20.10 | Библиотека функционирует |
20.11 | Библиотека функционирует |
20.12 | Функции обработки времени библиотечных |
Стандартное окружение C
Правило | Описание |
---|---|
1.1 | Программа не должна содержать нарушений стандартного синтаксиса C и ограничений и не должна превышать пределов перевода реализации. |
1.2 | Языковые расширения не должны использоваться. |
Неиспользованный код
Правило | Описание |
---|---|
2.6 | Функция не должна содержать неиспользованных объявлений меток. |
2.7 | В функциях не должно быть неиспользованных параметров. |
Комментарии
Правило | Описание |
---|---|
3.1 | Последовательности символов |
3.2 | Сращивание линий не должно использоваться в |
Наборы символов и лексические соглашения
Правило | Описание |
---|---|
4.1 | Восьмиугольные и шестнадцатеричные выходные последовательности должны быть прекращены. |
4.2 | Триграфы не должны использоваться. |
Идентификаторы
Правило | Описание |
---|---|
5.2 | Идентификаторы, объявленные в тех же возможностях и пространстве имен, должны быть различными. |
5.3 | Идентификатор, объявленный во внутренних возможностях, не должен скрывать идентификатор, объявленный во внешних возможностях. |
5.4 | Идентификаторы макросов должны быть различными. |
5.5 | Идентификаторы должны отличаться от макро- имен. |
Типы
Правило | Описание |
---|---|
6.1 | Битовые поля должны быть объявлены только с соответствующим типом. |
6.2 | Однобитовые именованные битовые поля не должны иметь тип со знаком. |
Литералы и константы
Правило | Описание |
---|---|
7.1 | Восьмиугольные константы не должны использоваться. |
7.2 | Суффикс «u» или «U» применяется ко всем целочисленным константам, которые представлены в беззнаковом типе. |
7.3 | Строчный символ «l» не должен использоваться в буквальном суффиксе. |
7.4 | Строковый литерал не должен назначаться объекту, если только тип объекта не является «указателем на сертифицированный char». |
Декларации и определения
Правило | Описание |
---|---|
8.1 | Типы должны быть четко указаны. |
8.2 | Типы функций должны быть в форме прототипа с именованными параметрами. |
8.4 | Совместимое объявление должно быть видно, когда определен объект или функция с внешним редактированием. |
8.5 | Внешний объект или функция объявляются один раз в одном и только в одном файле. |
8.6 | Идентификатор с внешним редактированием должен иметь только одно внешнее определение. |
8.8 | The |
8.10 | Встроенная функция должна быть объявлена с |
8.11 | Когда массив с внешним редактированием объявлен, его размер должен быть явно задан. |
8.12 | В список перечислителя значение неявно заданной постоянной перечисления должно быть уникальным. |
8.14 | The |
Инициализация
Правило | Описание |
---|---|
9.2 | Инициализатор агрегата или объединения должен быть заключен в скобки. |
9.3 | Массивы не должны быть частично инициализированы. |
9.4 | Элемент объекта не должен быть инициализирован более одного раза. |
9.5 | Если для инициализации объекта массива используются назначенные инициализаторы, то размер массива должен задаваться явным образом. |
Модель Essential Type
Правило | Описание |
---|---|
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 | The |
15.2 | The |
15.3 | Любая метка, на которую ссылается |
15.4 | Должно быть не более одного |
15.5 | Функция должна иметь одну точку выхода в конце |
15.6 | Тело итерации-оператора или селекции должно быть составным оператором. |
15.7 | Все |
Операторы Switch
Правило | Описание |
---|---|
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 | The |
18.5 | Объявления должны содержать не более двух уровней вложенности указателей. |
18.7 | Гибкие представители массива не должны быть объявлены. |
18.8 | Типы массивов переменной длины не должны использоваться. |
Перекрывающееся хранилище
Правило | Описание |
---|---|
19.2 | The |
Директивы предварительной обработки
Правило | Описание |
---|---|
20.1 |
|
20.2 | The |
20.3 | The |
20.4 | Макрос не должен быть определен с таким же именем, как ключевое слово. |
20.5 |
|
20.6 | Лексемы, которые выглядят как директива предварительной обработки, не должны происходить в макро- аргумент. |
20.7 | Выражения, вытекающие из расширения макро- параметры, заключаются в круглые скобки. |
20.8 | Управляющее выражение |
20.9 | Все идентификаторы, используемые в управляющем выражении |
20.10 | The |
20.11 | Параметр макроса, непосредственно следующий за |
20.12 | Параметр макроса, используемый в качестве операнда к |
20.13 | A линии, чья первая лексема |
20.14 | Все |
Стандартные библиотеки
Правило | Описание |
---|---|
21.1 |
|
21.2 | Зарезервированный идентификатор или имя макроса не должны объявляться. |
21.3 | Функции выделения и отмены выделения памяти |
21.4 | Стандартный файл заголовка |
21.5 | Стандартный файл заголовка |
21.6 | Входные/выходные функции Стандартной библиотеки не должны использоваться. |
21.7 | The |
21.8 | Библиотека функционирует |
21.9 | Библиотека функционирует |
21.10 | Функции «Стандартное время и дата библиотеки» не должны использоваться. |
21.11 | Стандартный файл заголовка |
21.12 | Особые функции обработки исключений |
Языковые независимые проблемы
Правило | Описание |
---|---|
0-1-7 | Значение, возвращаемое функцией, имеющей непустой тип возврата, который не является перегруженным оператором, всегда должно использоваться. |
0-1-11 | Не должно быть неиспользованных параметров (именованных или безымянных) в не- виртуальных функциях. |
0-1-12 | Не должно быть неиспользованных параметров (именованных или безымянных) в наборе параметров для виртуальной функции и всех функций, которые ее переопределяют. |
0-2-1 | Объект не должен быть назначен перекрывающемуся объекту. |
Общая информация
Правило | Описание |
---|---|
1-0-1 | Весь код должен соответствовать стандарту ISO/IEC 14882:2003 «Стандарт C++ с техническим исправлением 1». |
Лексические конвенции
Правило | Описание |
---|---|
2-3-1 | Триграфы не должны использоваться. |
2-5-1 | Диграфы не должны использоваться. |
2-7-1 | Последовательность символов/* не должна использоваться в комментарии C-стиля. |
2-10-1 | Различные идентификаторы должны быть типографски однозначными. |
2-10-2 | Идентификаторы, объявленные во внутренних возможностях, не должны скрывать идентификатор, объявленный во внешних возможностях. |
2-10-3 | Имя typedef (включая проверку, если она имеется) должно быть уникальным идентификатором. |
2-10-4 | Имя класса, объединения или перечисления (включая проверку, если таковая имеется) должно быть уникальным идентификатором. |
2-10-6 | Если идентификатор ссылается на тип, он также не должен относиться к объекту или функции в тех же возможностях. |
2-13-1 | Должны использоваться только те эвакуационные последовательности, которые определены в стандарте ISO/IEC 14882:2003. |
2-13-2 | Восьмеричные константы (кроме нуля) и восьмеричные выходные последовательности (кроме «\0 ») не должны использоваться. |
2-13-3 | Суффикс «U» применяется ко всем восьмеричным или шестнадцатеричным целочисленным буквам беззнакового типа. |
2-13-4 | Буквальные суффиксы должны быть верхними. |
2-13-5 | Узкие и широкие строковые литералы не должны быть сцеплены. |
Основные концепции
Правило | Описание |
---|---|
3-1-1 | Можно включать любой заголовочный файл в несколько модули перевода, не нарушая правила единого определения. |
3-1-2 | Функции не должны быть объявлены на блоке возможностей. |
3-1-3 | Когда массив объявлен, его размер должен быть указан явно или определен неявно путем инициализации. |
3-3-1 | Объекты или функции с внешним редактированием должны быть объявлены в заголовочном файле. |
3-3-2 | Если функция имеет внутреннее редактирование, все повторные объявления должны включать в себя статический спецификатор класса памяти. |
3-4-1 | Идентификатор, объявленный как объект или тип, должен быть определен в блоке, который минимизирует его видимость. |
3-9-1 | Типы, используемые для объекта, типа возврата функции или параметра функции, должны быть идентичными token for-token во всех объявлениях и повторных объявлениях. |
3-9-2 | Вместо базовых числовых типов следует использовать шрифты, указывающие на размер и сигнальность. |
3-9-3 | Базовые битовые представления значений с плавающей точкой не должны использоваться. |
Стандартные преобразования
Правило | Описание |
---|---|
4-5-1 | Выражения с типом bool не должны использоваться как операнды для встроенных операторов, кроме оператора назначения =, логических операторов &, ||,!, операторов равенства = = и! =, унарного оператора и условного оператора. |
4-5-2 | Выражения с типом enum не должны использоваться как операнды для создания в операторах, отличных от оператора индекса [], оператора присвоения =, операторов равенства = = и! =, унарного & оператора и реляционных операторов <, < =, >, > =. |
4-5-3 | Выражения с типом (равнина) char и wchar_t не должны использоваться в качестве операндов к встроенным операторам кроме оператора назначения =, операторы равенства == и! =, и одноместное & оператор. |
Выражения
Правило | Описание |
---|---|
5-0-1 | Значение выражения должно быть тем же самым в любом порядке оценки, который позволяет стандарт. |
5-0-2 | Ограниченная зависимость должна быть помещена в выражения в правилах приоритета оператора C++. |
5-0-3 | Выражение cvalue не должно неявно преобразовываться в другой базовый тип. |
5-0-4 | Неявное интегральное преобразование не должно изменять сигнальность базового типа. |
5-0-5 | Не должно быть неявных преобразований с плавающим интегралом. |
5-0-6 | Неявное интегральное преобразование или преобразование с плавающей точкой не должно уменьшать размер базового типа. |
5-0-7 | Не должно быть явных плавающих-интегральных преобразований выражения cvalue. |
5-0-8 | Явное интегральное преобразование или преобразование с плавающей точкой не должно увеличивать размер базового типа выражения cvalue. |
5-0-9 | Явное интегральное преобразование не должно изменять сигнальность базового типа выражения cvalue. |
5-0-10 | Если побитовые операторы ~ и < < применяются к операнду с базовым типом беззнакового char или беззнакового шорт, результат должен быть немедленно приведен к базовому типу операнда. |
5-0-11 | Обычный тип char должен использоваться только для хранения и использования значений символов. |
5-0-12 | подпись char и беззнаковый тип char должны использоваться только для хранения и использования числовых значений. |
5-0-13 | Условие оператора if и условие оператора итерации должны иметь тип bool. |
5-0-14 | Первый операнд условного оператора должен иметь тип bool. |
5-0-15 | Индексация массива должна быть единственной формой арифметики указателя. |
5-0-18 | >, > =, <, < = не применяется к объектам типа указателя, кроме тех случаев, когда они указывают на один и тот же массив. |
5-0-19 | Объявление объектов должно содержать не более двух уровней опосредования указателя. |
5-0-20 | Непостоянные операнды двоичному битовому оператору должны иметь тот же базовый тип. |
5-0-21 | Битовые операторы должны применяться только к операндам неподписанного базового типа. |
5-2-1 | Каждый операнд логического & & или || должен быть постфиксом - выражением. |
5-2-2 | Указатель на виртуальный базовый класс должен быть приведен только к указателю на производный класс с помощью dynamic_cast. |
5-2-3 | Приведения от базового класса к производному классу не должны выполняться на полиморфных типах. |
5-2-4 | Отливки C-типа (кроме отливок с пустыми данными) и отливки функционального обозначения (кроме явных вызовов конструктора) не должны использоваться. |
5-2-5 | Отливка не должна удалять из типа указателя или ссылки какую-либо несовпадающую или летучую проверку. |
5-2-6 | Приведение не должно преобразовывать указатель в функцию в любой другой тип указателя, включая указатель на тип функции. |
5-2-7 | Объект с типом указателя не должен преобразовываться в несвязанный тип указателя, прямо или косвенно. |
5-2-8 | Объект с целым типом или указателем на тип void не должен преобразовываться в объект с типом указателя. |
5-2-9 | Приведение не должно преобразовывать тип указателя в интегральный тип. |
5-2-10 | Операторы шага (+ +) и декремента (--) не должны смешиваться с другими операторами в выражении. |
5-2-11 | Оператор запятыми, & & оператор и оператор || не должны быть перегружены. |
5-2-12 | Идентификатор с типом массива, переданный как аргумент функции, не должен распадаться на указатель. |
5-3-1 | Каждый операнд! оператор, логический & & или логический || операторы должны иметь тип bool. |
5-3-2 | Оператор унарного минуса не применяется к выражению, базовый тип которого не подписан. |
5-3-3 | Унарный & оператор не должен быть перегружен. |
5-3-4 | Оценка операнда оператору размера не должна содержать побочных эффектов. |
5-8-1 | Операнд правой руки оператора сдвига должен находиться между нулем и на единицу меньше ширины в битах базового типа операнда левой руки. |
5-14-1 | Операнд правой руки логического & & или || оператора не должен содержать побочных эффектов. |
5-18-1 | Оператор запятыми не должен использоваться. |
5-19-1 | Оценка постоянных беззнаковых целочисленных выражений не должна приводить к переносу. |
Операторы
Правило | Описание |
---|---|
6-2-1 | Операторы назначения не должны использоваться в подмножествах. |
6-2-2 | Выражения с плавающей точкой не должны прямо или косвенно проверяться на равенство или неравенство. |
6-2-3 | Перед предварительной обработкой нулевой оператор должно происходить только в линии само по себе; за ним может последовать комментарий при условии, что первый символ, следующий за оператором null, является символом белого пространства. |
6-3-1 | Оператор, образующий тело переключателя, в то время как, сделать... в то время как или для оператора является составным оператором. |
6-4-1 | За конструкцией if (условие) следует составной оператор. За другим ключевым словом следует либо составной оператор, либо другой оператор if. |
6-4-2 | Все, если... иное, если конструкции должны быть прекращены в соответствии с пунктом об ином. |
6-4-3 | Оператор switch должен быть хорошо сформированным оператором switch. |
6-4-4 | Метка switch-label должна использоваться только в том случае, если наиболее близко заключенным составным оператором является тело оператора switch. |
6-4-5 | Оператор безоговорочного переключения или пропуска прекращает действие каждого пункта о непустом переключателе. |
6-4-6 | Конечным пунктом оператора switch является положение по умолчанию. |
6-4-7 | Условие оператора switch не должно иметь типа bool. |
6-4-8 | Каждый оператор switch должен иметь по крайней мере один пункт-случай. |
6-5-1 | Цикл for должен содержать один контур-счетчик, который не должен иметь плавающего типа. |
6-5-2 | Если счетчик цикла не изменяется -- или++, то в пределах условия счетчик цикла должен использоваться только в качестве операнда на < =, <, > или > =. |
6-5-3 | Счетчик контура не должен изменяться в пределах условия или оператора. |
6-5-4 | Счетчик цикла должен быть изменен одним из: --, + +, - = n или + = n; где n остается постоянным для длительности цикла. |
6-5-5 | Переменная loop-control, отличная от счетчика loop-counter, не должна изменяться в рамках условия или выражения. |
6-5-6 | Переменная loop-control, отличная от счетчика loop-counter, измененная в операторе, должна иметь тип bool. |
6-6-1 | Любая метка, на которую ссылается оператор goto, должна быть объявлена в том же блоке или в блоке, содержащем оператор goto. |
6-6-2 | Оператор goto должен перейти к метке, объявленной позже в том же теле функции. |
6-6-3 | Оператор продолжения должен использоваться только в хорошо сформированном цикле for. |
6-6-4 | Для любого оператора итерации должно быть не более одного оператора break или goto, используемого для завершения цикла. |
6-6-5 | Функция должна иметь одну точку выхода в конце функции. |
Декларации
Правило | Описание |
---|---|
7-3-1 | Глобальное пространство имен должно содержать только основные объявления пространства имен и внешние объявления «C». |
7-3-2 | Основной идентификатор не должен использоваться для функции, отличной от основной глобальной функции. |
7-3-3 | В файлах заголовков не должно быть неназванных пространств имен. |
7-3-4 | использование-директивы не должно использоваться. |
7-3-5 | Несколько объявлений для идентификатора в том же пространстве имен не должны распространяться на объявление использования для этого идентификатора. |
7-3-6 | using-directives и using-declarations (исключая возможности или возможности функций using-declarations) не должны использоваться в файлах заголовков. |
7-4-2 | Инструкции ассемблера вводятся только с помощью объявления asm. |
7-4-3 | Язык сборки должен быть инкапсулирован и изолирован. |
Declarators
Правило | Описание |
---|---|
8-0-1 | init-declator-list или member-declator-list должны состоять из одного init-declator или member-declator соответственно. |
8-3-1 | Параметры в переопределяющей виртуальной функции должны либо использовать те же аргументы по умолчанию, что и функция, которую они переопределяют, либо не должны задавать какие-либо аргументы по умолчанию. |
8-4-1 | Функции не должны определяться с помощью обозначения эллипсиса. |
8-4-2 | Идентификаторы, используемые для параметров в повторном объявлении функции, должны быть идентичны идентификаторам в объявлении. |
8-4-3 | Все выходные пути из функции с непустым типом возврата должны иметь явный оператор возврата с выражением. |
8-4-4 | Идентификатор функции должен либо использоваться для вызова функции, либо ему должны предшествовать &. |
8-5-2 | Скобки должны использоваться для указания и соответствия структуры в ненулевой инициализации массивов и структур. |
8-5-3 | В списке перечислителей конструкция = не должна использоваться для явной инициализации представителей, отличных от первой, если только все элементы не инициализированы явным образом. |
Классы
Правило | Описание |
---|---|
9-3-1 | функции const представителя не должны возвращать неконстатные указатели или ссылки на классовые данные. |
9-3-2 | Представители функции не должны возвращать неконстатные указатели в классовые данные. |
9-5-1 | Объединения не должны использоваться. |
9-6-2 | Битовые поля должны быть либо типа bool, либо явно беззнакового или подписанного интегрального типа. |
9-6-3 | Битовые поля не должны иметь тип перечисления. |
9-6-4 | Именованные битовые поля со знаком целого типа должны иметь длину более одного бита. |
Производные классы
Правило | Описание |
---|---|
10-1-1 | Классы не должны быть выведены из виртуальных основ. |
10-1-2 | Базовый класс должен быть объявлен виртуальным, только если он используется в иерархии алмазов. |
10-1-3 | Доступный базовый класс не должен быть как виртуальным, так и невирусным в одной иерархии. |
10-2-1 | Все доступные имена сущностей в нескольких иерархиях наследования должны быть уникальными. |
10-3-1 | Не должно быть более одного определения каждой виртуальной функции на каждом пути через иерархию наследования. |
10-3-2 | Каждая переопределяющая виртуальная функция должна быть объявлена с помощью виртуального ключевого слова. |
10-3-3 | Виртуальная функция должна быть переопределена только чистой виртуальной функцией, если она сама объявлена как чистая виртуальная. |
Представитель доступом членов
Правило | Описание |
---|---|
11-0-1 | Данные представителей в типах классов, отличных от POD, должны быть частными. |
Специальные Представители функции
Правило | Описание |
---|---|
12-1-1 | Динамический тип объекта не должен использоваться из тела его конструктора или деструктора. |
12-1-2 | Все конструкторы класса должны явным образом вызвать конструктор для всех его непосредственных базовых классов и всех виртуальных базовых классов. |
12-1-3 | Все конструкторы, вызываемые с одним аргументом основного типа, объявляются явными. |
12-8-1 | Конструктор копирования должен инициализировать только свои базовые классы и нестатические представители класса, представителем которого он является. |
12-8-2 | Оператор назначения копии должен быть объявлен защищенным или частным в абстрактном классе. |
Шаблоны
Правило | Описание |
---|---|
14-5-2 | Конструктор копирования должен быть объявлен, когда существует конструктор шаблона с одним параметром, который является типовым параметром. |
14-5-3 | Оператор назначения копии объявляется при наличии оператора назначения шаблона с параметром, который является типовым параметром. |
14-6-1 | В шаблоне класса с зависимой основой любое имя, которое может быть найдено в этой зависимой основе, должно упоминаться с использованием квалифицированного идентификатора или this- >. |
14-6-2 | Функция, выбранная разрешением перегрузки, должна разрешаться до функции, объявленной ранее в модуле перевода. |
14-7-3 | Все частичные и явные специализации для шаблона должны быть объявлены в том же файле, что и объявление их основного шаблона. |
14-8-1 | Перегруженные шаблоны функций не должны быть явно специализированными. |
14-8-2 | Жизнеспособный набор функций для вызова функций должен либо не содержать специализаций функций, либо содержать только специализации функций. |
Обработка исключений
Правило | Описание |
---|---|
15-0-2 | Объект исключения не должен иметь тип указателя. |
15-0-3 | Управление не должно передаваться в блок try или catch с помощью goto или оператора switch. |
15-1-2 | Значение NULL не должно передаваться явным образом. |
15-1-3 | Пустой бросок (бросок;) должен использоваться только в составной оператора обработчика улавливания. |
15-3-2 | Должен быть по крайней мере один обработчик исключений, чтобы поймать все необработанные исключения |
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-5-1 | Деструктор классов не должен выходить за исключением. |
15-5-2 | Если заявление функции включает спецификацию исключения, то функция должна быть способна выдавать только исключения указанного типа (типов). |
Директивы предварительной обработки
Правило | Описание |
---|---|
16-0-1 | # включить директивы в файл должны предшествовать только другие директивы предпроцессора или комментарии. |
16-0-2 | Макросы должны быть только # define 'd или # undef' d в глобальном пространстве имен. |
16-0-3 | # undef не должен использоваться. |
16-0-4 | Функциональные макросы не должны быть определены. |
16-0-5 | Аргументы в функциональный макрос не должны содержать лексемы, которые выглядят как директивы предварительной обработки. |
16-0-6 | В определении функционального макроса каждый образец параметра должен быть заключен в круглые скобки, если он не используется в качестве операнда # или # #. |
16-0-7 | Неопределенные идентификаторы макросов не должны использоваться в директивах предпроцессора # if или # elif, за исключением операндов определенному оператору. |
16-0-8 | Если лексема # появляется в качестве первой лексемы в линии, то за ним немедленная следует лексема предварительной обработки. |
16-1-1 | Определенный оператор препроцессора должен использоваться только в одной из двух стандартных форм. |
16-1-2 | Все директивы # else, # elif и # endif предпроцессора должны находиться в том же файле, что и директива # if или # ifdef, с которой они связаны. |
16-2-1 | Предварительный процессор должен использоваться только для включения файлов и включать защитные элементы. |
16-2-2 | Макросы C++ должны использоваться только для: включая защитные ограждения, определители типа или спецификаторы классов памяти. |
16-2-3 | Необходимо предусмотреть охрану. |
16-2-4 | Символы ', ",/* или//не должны присутствовать в имени файла заголовка. |
16-2-5 | Символ\не должен находиться в имени файла заголовка. |
16-2-6 | После директивы # include следует последовательность < filename > или «filename». |
16-3-1 | В одном описании макроса должно быть не более одного вхождения операторов # или # определение |
16-3-2 | Операторы # и # # не должны использоваться. |
16-6-1 | Все виды применения директивы # pragma должны быть задокументированы. |
17-0-1 | Зарезервированные идентификаторы, макросы и функции в стандартной библиотеке не должны быть определены, переопределены или неопределены. |
17-0-2 | Имена стандартных библиотечных макросов и объектов не должны использоваться повторно. |
17-0-5 | Макрос setjmp и функция longjmp не должны использоваться. |
Библиотека языковой поддержки
Правило | Описание |
---|---|
18-0-1 | Библиотека C не должна использоваться. |
18-0-2 | Не должны использоваться библиотечные функции atof, atoi и atol из библиотеки < cstdlib >. |
18-0-3 | Функции библиотеки abort, exit, getenv и система из библиотеки < cstdlib > не должны использоваться. |
18-0-4 | Функции обработки времени библиотеки < ctime > не должны использоваться. |
18-0-5 | Неограниченные функции библиотеки < cstring > не должны использоваться. |
18-2-1 | Смещение макроса не должно использоваться. |
18-4-1 | Динамическое выделение памяти «куча» не должно использоваться. |
18-7-1 | Средства обработки сигналов < csignal > не должны использоваться. |
Библиотека диагностики
Правило | Описание |
---|---|
19-3-1 | Индикатор ошибки errno не должен использоваться. |
Библиотека ввода/вывода
Правило | Описание |
---|---|
27-0-1 | Библиотека ввода/вывода потока < cstdio > не должна использоваться. |