В режиме быстрого анализа 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) | Операция равенства в операторе назначения |
| Недопустимое использование оператора = (assignment) ( bad_equal_use) | Назначение в условном операторе |
| Недопустимое использование операции с плавающей запятой ( bad_float_op) | Неточное сравнение переменных с плавающей запятой |
| Отсутствует значение null в строковом массиве ( missing_null_char) | Строка не заканчивается нулевым символом |
| Перекрывающееся назначение ( 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) | operator = метод не возвращает указатель на текущий объект |
| Оператор назначения базового класса не вызван ( 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 оперирует с |
| Жестко закодированный размер буфера ( hard_coded_buffer_size) | Размер буфера памяти - это числовое значение вместо символьной константы |
| Жестко закодированная граница контура ( hard_coded_loop_boundary) | Контур представляет собой числовое значение вместо символьной константы |
| Аргумент большого проходного значения ( pass_by_value) | Большой аргумент передается по значению между функциями |
| Строка с несколькими инструкциями ( more_than_one_statement) | Несколько операторов в строке |
| Отсутствует разрыв корпуса коммутатора ( missing_switch_break) | Нет комментариев в конце варианта переключения без оператора break |
| Отсутствует сброс освобожденного указателя ( missing_freed_ptr_reset) | Свободный указатель не сопровождается инструкцией reset для очистки оставшихся данных |
| Неиспользуемый параметр ( unused_parameter) | Прототип функции имеет параметры, не считанные или записанные в теле функции |
На ранних этапах анализа программное обеспечение проверяет следующие правила.
Расширения языка
| Правило | Описание |
|---|---|
| 2.1 | Язык сборки должен быть инкапсулирован и изолирован. |
| 2.2 | Исходный код должен использовать только |
| 2.3 | Последовательность символов |
Документация
| Правило | Описание |
|---|---|
| 3.4 | Все виды использования |
Наборы символов
| Правило | Описание |
|---|---|
| 4.1 | Должны использоваться только те спасательные последовательности, которые определены в стандарте ISO C. |
| 4.2 | Триграфы не используются. |
Идентификаторы
| Правило | Описание |
|---|---|
| 5.2 | Идентификаторы во внутренней области не должны использовать то же имя, что и идентификатор во внешней области, и, следовательно, скрывать этот идентификатор. |
Типы
| Правило | Описание |
|---|---|
| 6.1 | Тип простого символа должен использоваться только для хранения и использования символьных значений. |
| 6.2 | Подписанный и неподписанный тип символа должен использоваться только для хранения и использования числовых значений. |
| 6.3 |
|
| 6.4 | Битовые поля должны быть определены только типа |
| 6.5 | Битовые поля типа |
Константы
| Правило | Описание |
|---|---|
| 7.1 | Восьмеричные константы (отличные от нуля) и восьмеричные escape-последовательности не используются. |
Объявления и определения
| Правило | Описание |
|---|---|
| 8.1 | Функции должны иметь объявления прототипов, и прототипы должны быть видны как при определении функции, так и при вызове. |
| 8.2 | Каждый раз, когда объект или функция объявляется или определяется, ее тип должен быть явно указан. |
| 8.3 | Для каждого параметра функции тип, указанный в описании и определении, должен быть идентичным, а возвращаемые типы - идентичными. |
| 8.5 | В файле заголовка не должно быть определений объектов или функций. |
| 8.6 | Функции всегда должны быть объявлены в объеме файла. |
| 8.7 | Объекты должны быть определены в объеме блока, если доступ к ним осуществляется только из одной функции. |
| 8.8 |
Внешний объект или функция должны быть объявлены в одном файле и только в одном файле. |
| 8.9 |
Идентификатор с внешней связью должен иметь ровно одно внешнее определение. |
| 8.11 | |
| 8.12 | Когда массив объявлен с внешней связью, его размер должен быть указан явно или определен неявно при инициализации. |
Инициализация
| Правило | Описание |
|---|---|
| 9.2 | Фигурные скобки должны использоваться для указания и согласования структуры при ненулевой инициализации массивов и структур. |
| 9.3 | В списке перечислителей |
Преобразование арифметических типов
| Правило | Описание |
|---|---|
| 10.1 | Значение выражения целого типа не должно быть неявно преобразовано в другой базовый тип, если:
|
| 10.2 | Значение выражения плавающего типа не должно быть неявно преобразовано в другой тип, если
|
| 10.3 | Значение комплексного выражения целочисленного типа может быть приведено только к типу, который является более узким и имеет ту же сигнатуру, что и базовый тип выражения. |
| 10.4 | Значение комплексного выражения типа float может быть приведено только к более узкому плавающему типу. |
| 10.5 | Если побитовый оператор |
| 10.6 | Суффикс «U» применяется ко всем константам |
Преобразование типа указателя
| Правило | Описание |
|---|---|
| 11.1 | Преобразование не должно выполняться между указателем на функцию и любым типом, отличным от интегрального типа. |
| 11.2 | Преобразование не должно выполняться между указателем на объект и любым типом, отличным от интегрального типа, другим указателем на тип объекта или указателем на |
| 11.3 | Приведение не должно выполняться между типом указателя и интегральным типом. |
| 11.4 | Приведение не должно выполняться между указателем на тип объекта и другим указателем на тип объекта. |
| 11.5 | Не должен выполняться кастинг, который удаляет |
Выражения
| Правило | Описание |
|---|---|
| 12.1 | Ограниченная зависимость должна быть от правил приоритета оператора C в выражениях. |
| 12.3 | |
| 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 | Все операторы, отличные от NULL, должны либо
|
| 14.4 | |
| 14.5 | |
| 14.6 | Для любого оператора итерации должно быть не более одного |
| 14.7 | Функция должна иметь единственную точку выхода в конце функции. |
| 14.8 | Утверждение, образующее тело |
| 14.9 | Один |
| 14.10 | Все |
Операторы переключения
| Правило | Описание |
|---|---|
| 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 | |
| 19.4 | Макросы C должны расширяться только до инициализатора с скобками, константы, выражения в скобках, квалификатора типа, спецификатора класса хранения или конструкции do-while-zero. |
| 19.5 | Макросы не должны быть |
| 19.6 |
|
| 19.7 | Функция должна использоваться вместо функции типа-макро. |
| 19.8 | Функциональный макрос не должен вызываться без всех его аргументов. |
| 19.9 | Аргументы для функционально-подобного макроса не должны содержать маркеры, похожие на директивы предварительной обработки. |
| 19.10 | При определении функционального макроса каждый экземпляр параметра должен быть заключен в круглые скобки, если только он не используется в качестве операнда |
| 19.11 | Все идентификаторы макросов в директивах препроцессора должны быть определены перед использованием, за исключением |
| 19.12 | Должно быть не более одного случая |
| 19.13 | |
| 19.14 | Определенный оператор препроцессора должен использоваться только в одной из двух стандартных форм. |
| 19.15 | Необходимо принять меры предосторожности для предотвращения двойного включения содержимого файла заголовка. |
| 19.16 | Директивы предварительной обработки должны быть синтаксически значимыми, даже если они исключены препроцессором. |
| 19.17 | Все |
Стандартные библиотеки
| Правило | Описание |
|---|---|
| 20.1 | Зарезервированные идентификаторы, макросы и функции в стандартной библиотеке не должны быть определены, переопределены или не определены. |
| 20.2 | Имена стандартных библиотечных макросов, объектов и функций не должны использоваться повторно. |
| 20.4 | Динамическое выделение памяти кучи не должно использоваться. |
| 20.5 | Индикатор ошибки |
| 20.6 | Макрос |
| 20.7 | |
| 20.8 | Средства обработки сигналов |
| 20.9 | Библиотека ввода/вывода |
| 20.10 | Функции библиотеки |
| 20.11 | Функции библиотеки |
| 20.12 | Функции обработки времени библиотеки |
Стандартная среда C
| Правило | Описание |
|---|---|
| 1.1 | Программа не должна содержать нарушений стандартного синтаксиса и ограничений Си и не должна превышать предельных значений перевода реализации. |
| 1.2 | Расширения языка не должны использоваться. |
Неиспользуемый код
| Правило | Описание |
|---|---|
| 2.6 | Функция не должна содержать неиспользуемые объявления меток. |
| 2.7 | В функциях не должно быть неиспользуемых параметров. |
Комментарии
| Правило | Описание |
|---|---|
| 3.1 | Последовательности символов |
| 3.2 | Сращивание линий не должно использоваться в |
Наборы символов и лексические условные обозначения
| Правило | Описание |
|---|---|
| 4.1 | Восьмеричная и шестнадцатеричная escape-последовательности должны быть прекращены. |
| 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 | Строковый литерал не должен назначаться объекту, если тип объекта не является «указателем на условный символ». |
Объявления и определения
| Правило | Описание |
|---|---|
| 8.1 | Типы должны быть четко указаны. |
| 8.2 | Типы функций должны быть в виде прототипа с названными параметрами. |
| 8.4 | Совместимое объявление должно быть видимым при определении объекта или функции с внешней связью. |
| 8.5 | Внешний объект или функция объявляются один раз в одном и только в одном файле. |
| 8.6 | Идентификатор с внешней связью должен иметь ровно одно внешнее определение. |
| 8.8 | |
| 8.10 | Встроенная функция должна быть объявлена с помощью |
| 8.11 | При объявлении массива с внешней связью его размер должен быть указан явным образом. |
| 8.12 | В списке перечислителей значение неявно указанной константы перечисления должно быть уникальным. |
| 8.14 | |
Инициализация
| Правило | Описание |
|---|---|
| 9.2 | Инициализатор агрегата или соединения должен быть заключен в скобки. |
| 9.3 | Не допускается частичная инициализация массивов. |
| 9.4 | Элемент объекта не должен инициализироваться более одного раза. |
| 9.5 | Если для инициализации объекта массива используются назначенные инициализаторы, размер массива должен быть указан явным образом. |
Модель основного типа
| Правило | Описание |
|---|---|
| 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 | |
| 15.2 | |
| 15.3 | Любая метка, на которую ссылается |
| 15.4 | Должно быть не более одного |
| 15.5 | Функция должна иметь единственную точку выхода в конце |
| 15.6 | Тело итерационного оператора или оператора выбора должно быть составным оператором. |
| 15.7 | Все |
Операторы переключения
| Правило | Описание |
|---|---|
| 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 | |
| 18.5 | Объявления должны содержать не более двух уровней вложенности указателей. |
| 18.7 | Элементы гибкого массива не объявляются. |
| 18.8 | Типы массивов переменной длины не должны использоваться. |
Перекрывающееся хранилище
| Правило | Описание |
|---|---|
| 19.2 | |
Директивы предварительной обработки
| Правило | Описание |
|---|---|
| 20.1 |
|
| 20.2 | |
| 20.3 | |
| 20.4 | Макрос не должен быть определен с тем же именем, что и ключевое слово. |
| 20.5 |
|
| 20.6 | Маркеры, похожие на директиву предварительной обработки, не должны появляться в аргументе макроса. |
| 20.7 | Выражения, возникающие в результате расширения параметров макроса, должны быть заключены в круглые скобки. |
| 20.8 | Управляющее выражение |
| 20.9 | Все идентификаторы, используемые в управляющем выражении |
| 20.10 | |
| 20.11 | Параметр макроса, непосредственно следующий за |
| 20.12 | Параметр макроса, используемый в качестве операнда для |
| 20.13 | Строка, первым маркером которой является |
| 20.14 | Все |
Стандартные библиотеки
| Правило | Описание |
|---|---|
| 21.1 |
|
| 21.2 | Зарезервированный идентификатор или имя макроса объявляться не должны. |
| 21.3 | Функции выделения и освобождения памяти |
| 21.4 | Стандартный файл заголовка |
| 21.5 | Стандартный файл заголовка |
| 21.6 | Функции ввода/вывода стандартной библиотеки не используются. |
| 21.7 | |
| 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 | Имя типа (включая квалификацию, если она имеется) должно быть уникальным идентификатором. |
| 2-10-4 | Название класса, объединения или перечисления (включая квалификацию, если таковая имеется) должно быть уникальным идентификатором. |
| 2-10-6 | Если идентификатор относится к типу, он не должен также относиться к объекту или функции в той же области. |
| 2-13-1 | Должны использоваться только те спасательные последовательности, которые определены в стандарте ISO/IEC 14882:2003. |
| 2-13-2 | Восьмеричные константы (отличные от нуля) и восьмеричные escape-последовательности (отличные от «\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 | Выражения с перечислением типов не должны использоваться в качестве операндов для построения операторов, отличных от оператора подстрочного индекса [], оператора назначения =, операторов равенства = и! =, унарного & оператора и реляционных операторов <, < =, >, > =. |
| 4-5-3 | Выражения с типом (равнина) случайная работа и 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 | Явное интегральное преобразование не должно изменять сигнатуру базового типа выражения значения. |
| 5-0-10 | Если побитовые операторы ~ и < < применяются к операнду с нижележащим типом неподписанного символа или неподписанным коротким, результат должен быть немедленно приведен к нижележащему типу операнда. |
| 5-0-11 | Тип простого символа должен использоваться только для хранения и использования символьных значений. |
| 5-0-12 | подписанный символ и неподписанный символ должны использоваться только для хранения и использования числовых значений. |
| 5-0-13 | Условие оператора if и условие оператора iteration должны иметь тип 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 должен выполняться только в строке самостоятельно; за ним может следовать комментарий при условии, что первый символ, следующий за оператором null, является символом пробела. |
| 6-3-1 | Утверждение, образующее тело переключателя, в то время как, делать... в то время как или для оператора должно быть составным оператором. |
| 6-4-1 | За конструкцией if (условие) следует составная инструкция. За ключевым словом else следует либо составной оператор, либо другой оператор if. |
| 6-4-2 | Все, если... в противном случае, если конструкции должны быть прекращены пунктом else. |
| 6-4-3 | Оператор переключения должен быть хорошо сформированным оператором переключения. |
| 6-4-4 | Метка switch должна использоваться только в том случае, если самым близким составным оператором является тело оператора switch. |
| 6-4-5 | Заявление о безусловном сбросе или разрыве прекращает действие каждого непустого пункта о переключении. |
| 6-4-6 | Заключительным пунктом инструкции по переключению является пункт по умолчанию. |
| 6-4-7 | Состояние оператора переключения не должно иметь тип bool. |
| 6-4-8 | Каждый оператор переключения должен иметь по крайней мере один вариант. |
| 6-5-1 | Контур для шлейфа должен содержать один счетчик шлейфа, который не должен иметь плавающего типа. |
| 6-5-2 | Если счетчик цикла не изменяется на - или++, то в пределах условия счетчик цикла должен использоваться только в качестве операнда для < =, <, > или > =. |
| 6-5-3 | Счетчик контуров не должен изменяться в пределах условия или инструкции. |
| 6-5-4 | Счетчик контура должен быть изменен одним из: -, + +, - = n или + = n; где n остается постоянным в течение всего цикла. |
| 6-5-5 | Переменная управления контуром, отличная от счетчика контуров, не должна изменяться в пределах условия или выражения. |
| 6-5-6 | Переменная управления контуром, отличная от счетчика контуров, измененного в операторе, должна иметь тип bool. |
| 6-6-1 | Любая метка, на которую ссылается оператор goto, должна быть объявлена в том же блоке или в блоке, включающем оператор goto. |
| 6-6-2 | Оператор goto должен перейти к метке, объявленной позже в том же теле функции. |
| 6-6-3 | Оператор continue должен использоваться только в хорошо сформированном цикле для. |
| 6-6-4 | Для любого оператора итерации должно быть не более одного перерыва или оператора 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 (исключая scope scope или function scope using-declarations) не должны использоваться в файлах заголовков. |
| 7-4-2 | Инструкции по сборке должны вводиться только с использованием асм-декларации. |
| 7-4-3 | Язык сборки должен быть инкапсулирован и изолирован. |
Declarators
| Правило | Описание |
|---|---|
| 8-0-1 | init-declarator-list или member-declarator-list должен состоять из одного init-declarator или member-declarator соответственно. |
| 8-3-1 | Параметры переопределяющей виртуальной функции должны либо использовать те же аргументы по умолчанию, что и функция, которую они переопределяют, либо не должны указывать никакие аргументы по умолчанию. |
| 8-4-1 | Функции не должны определяться с помощью многоточия. |
| 8-4-2 | Идентификаторы, используемые для параметров в повторном объявлении функции, должны быть идентичны идентификаторам в объявлении. |
| 8-4-3 | Все пути выхода из функции с типом возврата non-void должны иметь явную инструкцию return с выражением. |
| 8-4-4 | Идентификатор функции должен использоваться либо для вызова функции, либо ему должен предшествовать &. |
| 8-5-2 | Фигурные скобки должны использоваться для указания и согласования структуры при ненулевой инициализации массивов и структур. |
| 8-5-3 | В списке перечислителей конструкция = не должна использоваться для явной инициализации элементов, отличных от первого, если только все элементы не инициализированы явным образом. |
Классы
| Правило | Описание |
|---|---|
| 9-3-1 | функции-члены const не должны возвращать указатели non-const или ссылки на данные класса. |
| 9-3-2 | Функции-члены не должны возвращать дескрипторы, не относящиеся к консту, в данные класса. |
| 9-5-1 | Профсоюзы не используются. |
| 9-6-2 | Битовые поля должны быть либо логического типа, либо явно неподписанного или подписанного интегрального типа. |
| 9-6-3 | Битовые поля не должны иметь тип перечисления. |
| 9-6-4 | Именованные битовые поля со знаком целочисленного типа должны иметь длину более одного бита. |
Производные классы
| Правило | Описание |
|---|---|
| 10-1-1 | Классы не должны быть производными от виртуальных баз. |
| 10-1-2 | Базовый класс объявляется виртуальным только в том случае, если он используется в алмазной иерархии. |
| 10-1-3 | Доступный базовый класс не должен быть одновременно виртуальным и невиртуальным в одной иерархии. |
| 10-2-1 | Все доступные имена сущностей в иерархии множественного наследования должны быть уникальными. |
| 10-3-1 | На каждом пути в иерархии наследования должно быть не более одного определения каждой виртуальной функции. |
| 10-3-2 | Каждая переопределяющая виртуальная функция должна быть объявлена с помощью ключевого слова virtual. |
| 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-block предусмотрено несколько обработчиков для производного класса и некоторых или всех его баз, обработчики упорядочиваются наиболее производными для базового класса. |
| 15-3-7 | Если в одном операторе try-catch или function-try-block предусмотрено несколько обработчиков, любой обработчик многоточия (catch-all) должен быть последним. |
| 15-5-1 | Деструктор класса не должен выходить за исключением. |
| 15-5-2 | Если объявление функции включает в себя спецификацию исключения, функция должна быть способна создавать исключения только указанного типа (типов). |
Директивы предварительной обработки
| Правило | Описание |
|---|---|
| 16-0-1 | # include directions в файле должны предшествовать только другие директивы или комментарии препроцессора. |
| 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 | Все директивы # elf, # elif и # endif препроцессора должны находиться в том же файле, что и директива # if или # ifdef, с которой они связаны. |
| 16-2-1 | Препроцессор должен использоваться только для включения файлов и включать защитные устройства. |
| 16-2-2 | Макросы C++ должны использоваться только для защиты, квалификаторов типа или спецификаторов класса хранения. |
| 16-2-3 | Должны быть предусмотрены защитные устройства. |
| 16-2-4 | Символы ', ",/* или//не должны присутствовать в имени файла заголовка. |
| 16-2-5 | Символ\не должен присутствовать в имени файла заголовка. |
| 16-2-6 | За директивой # include должна следовать последовательность < имя _ файла > или «имя _ файла». |
| 16-3-1 | В одном определении макроса должно присутствовать не более одного вхождения операторов # или # #. |
| 16-3-2 | Операторы # и # # не должны использоваться. |
| 16-6-1 | Все виды использования директивы # pragma должны быть задокументированы. |
| 17-0-1 | Зарезервированные идентификаторы, макросы и функции в стандартной библиотеке не должны быть определены, переопределены или не определены. |
| 17-0-2 | Имена стандартных библиотечных макросов и объектов не должны использоваться повторно. |
| 17-0-5 | Макрос setjmp и функция longjmp не должны использоваться. |
Библиотека языковой поддержки
| Правило | Описание |
|---|---|
| 18-0-1 | Библиотека Си не должна использоваться. |
| 18-0-2 | Библиотечные функции atoi, atoi и atol из библиотеки < cstdlib > не используются. |
| 18-0-3 | Функции библиотеки прерывание, выход, 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 > не должна использоваться. |