В режиме быстрого анализа 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 > не должна использоваться. |