В быстром аналитическом режиме Средство поиска Ошибки проверяет на подмножество дефектов и кодирующих правил только. Таблицы ниже приводят результаты, которые могут быть найдены в быстром анализе. См. также Use fast analysis mode for Bug Finder (-fast-analysis).
Статическое ЗУ
| Имя | Описание |
|---|---|
| Переполнение буфера от неправильного спецификатора формата строки ( 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) | Операция Equality в операторе присваивания |
| Недопустимое использование = (присвоение) оператор ( bad_equal_use) | Присвоение в условном операторе |
| Недопустимое использование операции с плавающей точкой ( bad_float_op) | Неточное сравнение переменных с плавающей точкой |
| Недостающий пустой указатель в массиве строк ( missing_null_char) | Строка не останавливается с нулевым символом |
| Перекрывающееся присвоение ( overlapping_assign) | Перекрытие памяти между левыми и правыми сторонами присвоения |
Возможно непреднамеренная оценка выражения из-за правил приоритета оператора Приоритет операторов | Правила приоритета оператора вызывают неожиданный порядок оценки в арифметическом выражении |
| Небезопасное преобразование между указателем и целым числом ( bad_int_ptr_cast) | Неправильно выровненные или недопустимые результаты преобразований между типами указателей и целочисленными типами |
| Неправильно введите используемый в sizeof ( ptr_sizeof_mismatch) | Аргумент |
Поток данных
| Имя | Описание |
|---|---|
| Код деактивирован постоянным ложным условием ( deactivated_code) | Сегмент кода деактивирован директивой |
| Пропавшие без вести оператора возврата ( missing_return) | Функция не делает возвращаемого значения, хотя возвращаются, тип не является пустым |
| Статическая невостребованная функция ( uncalled_func) | Функция со статическим контекстом, не названным в файле |
| Переменное затенение ( var_shadowing) | Переменная скрывает другую переменную того же имени с вложенным осциллографом |
Объектно-ориентированный
| Имя | Описание |
|---|---|
*this, не возвращенный в операторе присваивания копии( return_not_ref_to_this) | оператор = метод не возвращает указатель на текущий объект |
| Оператор присваивания базового класса, не названный ( 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) | Класс заменяет часть наследованных виртуальных функций с именем |
| Возвратитесь из не указатель const на инкапсулированный элемент данных ( breaking_data_encapsulation) | Метод возвращает указатель или ссылку на внутреннего члена объекта |
| Сам присвоение, не протестированное в операторе ( missing_self_assign_test) | Оператор присваивания копии не тестирует на самоприсвоение |
Безопасность
| Имя | Описание |
|---|---|
| Указатель функции присвоен с абсолютным адресом ( func_ptr_absolute_addr) | Константное выражение используется, когда функциональный адрес уязвим для инжекции кода |
Хорошая практика
| Имя | Описание |
|---|---|
| Битовая и арифметическая операция на тех же данных ( bitwise_arith_mix) | Оператор со смешанными битовыми и арифметическими операциями |
| Удалите пустого указателя ( delete_of_void_ptr) | удалите работает с указателем |
| Трудно закодированный buffer size ( hard_coded_buffer_size) | Размер буфера памяти является численным значением вместо символьной константы |
| Трудно закодированный контур цикла ( hard_coded_loop_boundary) | Контур цикла является численным значением вместо символьной константы |
| Большой аргумент передачи значением ( pass_by_value) | Большой аргумент передается значением между функциями |
| Строка больше чем с одним оператором ( more_than_one_statement) | Несколько операторов на строке |
| Недостающий пропуск случая переключателя ( missing_switch_break) | Никакие комментарии в конце случая переключателя без оператора завершения |
| Недостающий сброс освобожденного указателя ( missing_freed_ptr_reset) | Указатель, свободный не сопровождаемый оператором сброса, чтобы очистить оставшиеся данные |
| Неиспользованный параметр ( unused_parameter) | Прототип функции имеет параметры не чтение или написанный в теле функции |
Программное обеспечение проверяет следующие правила рано в анализ.
Расширения языка
| Правило | Описание |
|---|---|
| 2.1 | Ассемблер должен инкапсулироваться и изолироваться. |
| 2.2 | Исходный код должен только использовать комментарии стиля |
| 2.3 | Последовательность символов |
Документация
| Правило | Описание |
|---|---|
| 3.4 | Все использование директивы |
Наборы символов
| Правило | Описание |
|---|---|
| 4.1 | Только те escape-последовательности, которые заданы в стандарте ISO C, должны использоваться. |
| 4.2 | Trigraphs не должен использоваться. |
Идентификаторы
| Правило | Описание |
|---|---|
| 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 | Значение сложного выражения типа плавающего может только быть брошено к более узкому типу с плавающей точкой. |
| 10.5 | Если побитовый оператор |
| 10.6 | Суффикс "U" должен быть применен ко всем константам типов |
Преобразование типа указателя
| Правило | Описание |
|---|---|
| 11.1 | Преобразование не должно выполняться между указателем на функцию и любым типом кроме целочисленного типа. |
| 11.2 | Преобразование не должно выполняться между указателем на объект и любым типом кроме целочисленного типа, другим указателем на тип объекта или указателем на |
| 11.3 | Бросок не должен быть выполнен между типом указателя и целочисленным типом. |
| 11.4 | Бросок не должен быть выполнен между указателем на тип объекта и различным указателем на тип объекта. |
| 11.5 | Бросок не должен выполняться, который удаляет любой |
Выражения
| Правило | Описание |
|---|---|
| 12.1 | Ограниченная зависимость должна быть помещена в правила приоритета оператора К в выражениях. |
| 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 | Все непустые операторы должны быть также
|
| 14.4 | Оператор |
| 14.5 | Оператор |
| 14.6 | Для любого оператора цикла должно быть самое большее используемое завершение цикла for оператора один |
| 14.7 | Функция должна иметь одну точку выхода в конце функции. |
| 14.8 | Оператор, формирующий тело |
| 14.9 |
|
| 14.10 | Все построения |
Операторы switch
| Правило | Описание |
|---|---|
| 15.0 | Недостижимый код обнаруживается между оператором |
| 15.1 | Метка |
| 15.2 | Безусловный оператор |
| 15.3 | Итоговый пункт оператора |
| 15.4 | Выражение |
| 15.5 | Каждый оператор |
Функции
| Правило | Описание |
|---|---|
| 16.1 | Функции не должны быть заданы с переменными количествами аргументов. |
| 16.3 | Идентификаторы должны быть даны для всех параметров в объявлении прототипа функции. |
| 16.5 | Функции без параметров должны быть объявлены с типом параметра |
| 16.6 | Количество аргументов, переданных функции, должно совпадать с количеством параметров. |
| 16.8 | Все выходные пути от функции с non- |
| 16.9 | Функциональный идентификатор должен только использоваться или с предыдущим |
Указатели и массивы
| Правило | Описание |
|---|---|
| 17.4 | Индексация массива должна быть единственной позволенной формой адресной арифметики с указателями. |
| 17.5 | Тип не должен содержать больше чем 2 уровня косвенности указателя. |
Структуры и объединения
| Правило | Описание |
|---|---|
| 18.1 | Вся структура или типы объединения должны быть завершены в конце модуля перевода. |
| 18.4 | Объединения не должны использоваться. |
Предварительная обработка директив
| Правило | Описание |
|---|---|
| 19.1 | Операторам |
| 19.2 | Нестандартные символы не должны происходить на имена заголовочного файла в директивах |
| 19.3 | Директива |
| 19.4 | C макросы только расширюсь до заключенного в фигурные скобки инициализатора, константы, заключенного в скобки выражения, спецификатора типа, спецификатора класса памяти, или построение "делает в то время как нуль". |
| 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 | Программа не должна содержать нарушения стандартного Синтаксиса C и ограничения, и не должна превышать пределы перевода реализации. |
| 1.2 | Расширения языка не должны использоваться. |
Неиспользованный код
| Правило | Описание |
|---|---|
| 2.6 | Функция не должна содержать неиспользованные описания меток. |
| 2.7 | В функциях не должно быть никаких неиспользованных параметров. |
Комментарии
| Правило | Описание |
|---|---|
| 3.1 | Последовательности символов |
| 3.2 | Соединение строки не должно использоваться в комментариях |
Наборы символов и лексические соглашения
| Правило | Описание |
|---|---|
| 4.1 | Должны быть отключены восьмеричные и шестнадцатеричные escape-последовательности. |
| 4.2 | Trigraphs не должен использоваться. |
Идентификаторы
| Правило | Описание |
|---|---|
| 5.2 | Идентификаторы, объявленные в том же осциллографе и пространстве имен, должны быть отличными. |
| 5.3 | Идентификатор, объявленный во внутреннем осциллографе, не должен скрывать идентификатор, объявленный во внешнем осциллографе. |
| 5.4 | Макро-идентификаторы должны быть отличными. |
| 5.5 | Идентификаторы должны быть отличны от макро-имен. |
Типы
| Правило | Описание |
|---|---|
| 6.1 | Битовые поля должны только быть объявлены с соответствующим типом. |
| 6.2 | Одноразрядные именованные битовые поля не должны иметь типа со знаком. |
Литералы и константы
| Правило | Описание |
|---|---|
| 7.1 | Восьмеричные константы не должны использоваться. |
| 7.2 | Суффикс "u" или "U" должен быть применен ко всем целочисленным константам, которые представлены в типе без знака. |
| 7.3 | Символ нижнего регистра "l" не должен использоваться в литеральном суффиксе. |
| 7.4 | Строковый литерал не должен быть присвоен объекту, если тип объекта не будет "указателем на квалифицированный к const char". |
Объявления и определения
| Правило | Описание |
|---|---|
| 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 | Бросок не должен удалять const или энергозависимую проверку от типа, на который указывает указатель. |
| 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 | Все построения |
Операторы switch
| Правило | Описание |
|---|---|
| 16.1 | Все операторы |
| 16.2 | Метка |
| 16.3 | Безусловный оператор |
| 16.4 | Каждый оператор |
| 16.5 | Метка |
| 16.6 | Каждый оператор |
| 16.7 |
|
Функции
| Правило | Описание |
|---|---|
| 17.1 | Функции |
| 17.3 | Функция не должна быть объявлена неявно. |
| 17.4 | Все выходные пути от функции с non- |
| 17.6 | Объявление параметра массива не должно содержать ключевое слово |
| 17.7 | Значение, возвращенное функцией, имеющей non- |
Указатели и массивы
| Правило | Описание |
|---|---|
| 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 | Trigraphs не должен использоваться. |
| 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 | Только те escape-последовательности, которые заданы в 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 | Типы, используемые для объекта, функционального типа возврата или параметра функции, должны быть лексемой для лексемы, идентичной во всех объявлениях и переобъявлениях. |
| 3-9-2 | Определения типов, которые указывают на размер и со знаком, должны использоваться вместо основных числовых типов. |
| 3-9-3 | Базовые битные представления значений с плавающей точкой не должны использоваться. |
Стандартные преобразования
| Правило | Описание |
|---|---|
| 4-5-1 | Выражения с типом bool не должны использоваться в качестве операндов к встроенным операторам кроме оператора присваивания =, логические операторы &&, ||!, операторы равенства == и! =, унарное & оператор и условный оператор. |
| 4-5-2 | Выражения с перечислением типа не должны использоваться в качестве операндов к созданному - в операторах кроме нижнего оператора [], оператор присваивания =, операторы равенства == и! =, унарное & оператор и операторы отношения <<=>,> =. |
| 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 | Если побитовые операторы ~ и <<будут применены к операнду с базовым типом символьного или короткого целого без знака без знака, результат должен быть сразу брошен к базовому типу операнда. |
| 5-0-11 | Простой символьный тип должен только использоваться для устройства хранения данных и использования символьных значений. |
| 5-0-12 | символ со знаком и символьный тип без знака должны только использоваться для устройства хранения данных и использования числовых значений. |
| 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 | Бросок не должен удалять const или энергозависимую проверку от типа указателя или ссылки. |
| 5-2-6 | Бросок не должен преобразовывать указатель на функцию ни к какому другому типу указателя, включая указатель на функциональный тип. |
| 5-2-7 | Объект с типом указателя не должен быть преобразован в несвязанный тип указателя, ни один прямо или косвенно. |
| 5-2-8 | Объект с целочисленным типом или указателем, чтобы освободить тип не должен быть преобразован в объект с типом указателя. |
| 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 | Оценка операнда к sizeof оператору не должна содержать побочные эффекты. |
| 5-8-1 | Правый операнд оператора сдвига должен находиться между нулем и меньше, чем ширина в битах базового типа левого операнда. |
| 5-14-1 | Правый операнд логического && или || оператор не должен содержать побочные эффекты. |
| 5-18-1 | Оператор запятой не должен использоваться. |
| 5-19-1 | Оценка постоянных выражений беззнаковых целых чисел не должна вести, чтобы повториться. |
Операторы
| Правило | Описание |
|---|---|
| 6-2-1 | Операторы присваивания не должны использоваться в подвыражениях. |
| 6-2-2 | Выражения с плавающей точкой не должны быть прямо или косвенно протестированы на равенство или неравенство. |
| 6-2-3 | Перед предварительной обработкой пустой оператор должен только произойти на строке отдельно; это может сопровождаться комментарием, при условии, что первый символ после пустого оператора является белым - пробел. |
| 6-3-1 | Оператор, формирующий тело переключателя, в то время как, делает..., в то время как или для оператора будет составной оператор. |
| 6-4-1 | Если (условие) создают, буду сопровождаться составным оператором. Еще ключевое слово должно сопровождаться или составным оператором или другим оператором if. |
| 6-4-2 | Все, если... еще, если построения должны быть отключены с выражением else. |
| 6-4-3 | Оператор switch должен быть правильно построенным оператором switch. |
| 6-4-4 | Метка переключателя должна только использоваться, когда наиболее тесно заключающий составной оператор будет телом оператора 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 | Контрольная переменная цикла кроме счетчика цикла не должна быть изменена в условии или выражении. |
| 6-5-6 | Контрольная переменная цикла кроме счетчика цикла, который изменяется в операторе, должна иметь тип bool. |
| 6-6-1 | Любая метка, на которую ссылается оператор перехода, должна быть объявлена в том же блоке, или в блоке, заключающем оператор перехода. |
| 6-6-2 | Оператор перехода должен перейти к метке, объявленной позже в том же теле функции. |
| 6-6-3 | Оператор continue должен только использоваться в правильно построенном цикле for. |
| 6-6-4 | Для любого оператора цикла должен быть не больше, чем один оператор завершения, или оператор перехода использовал завершение цикла for. |
| 6-6-5 | Функция должна иметь одну точку выхода в конце функции. |
Объявления
| Правило | Описание |
|---|---|
| 7-3-1 | Глобальное пространство имен должно только содержать основные, объявления пространства имен и экстерна "C" объявления. |
| 7-3-2 | Основной идентификатор не должен использоваться для функции кроме глобального функционального основного. |
| 7-3-3 | В заголовочных файлах не должно быть никаких пространств имен без имени. |
| 7-3-4 | директивы использования не должны использоваться. |
| 7-3-5 | Многократные объявления для идентификатора в том же пространстве имен не должны колебаться между объявлением использования для того идентификатора. |
| 7-3-6 | директивы использования и объявления использования (исключая осциллограф класса или функциональные объявления использования осциллографа) не должны использоваться в заголовочных файлах. |
| 7-4-2 | Ассемблерные инструкции должны только быть введены с помощью asm объявления. |
| 7-4-3 | Ассемблер должен инкапсулироваться и изолироваться. |
Операторы объявления
| Правило | Описание |
|---|---|
| 8-0-1 | Init-declarator-list или членский список оператора объявления должны состоять из одного init-оператора-объявления или членского оператора объявления соответственно. |
| 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 не должны возвращать указатели неconst или ссылки на данные класса. |
| 9-3-2 | Функции членства не должны возвращать указатели неconst на данные класса. |
| 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 | В шаблоне класса с зависимой основой любое имя, которое может быть найдено в той зависимой основе, должно быть отнесено в использование квалифицированного ID или этого->. |
| 14-6-2 | Функция, выбранная разрешением перегрузки, должна решить к функции, объявленной ранее в модуле перевода. |
| 14-7-3 | Все частичные и явные специализации для шаблона должны быть объявлены в том же файле как объявление их первичного шаблона. |
| 14-8-1 | Шаблоны перегруженной функции не должны быть явным образом специализированы. |
| 14-8-2 | Жизнеспособный функциональный набор для вызова функции не должен или содержать функциональные специализации, или только содержать функциональные специализации. |
Обработка исключений
| Правило | Описание |
|---|---|
| 15-0-2 | Объект исключения не должен иметь типа указателя. |
| 15-0-3 | Управление не должно быть передано в попытку или блок выгоды с помощью goto или оператора switch. |
| 15-1-2 | NULL не должен быть выдан явным образом. |
| 15-1-3 | Пустой бросок (бросок;) буду только использоваться в составном операторе обработчика выгоды. |
| 15-3-2 | Должен быть по крайней мере один обработчик исключений, чтобы отловить все в противном случае необработанные исключения |
| 15-3-3 | Обработчики реализации функционального блока попытки конструктора класса или деструктора не должны ссылаться на нестатических участников от этого класса или его основ. |
| 15-3-5 | Исключение типа класса должно всегда отлавливаться ссылкой. |
| 15-3-6 | Где несколько обработчиков обеспечиваются в одном операторе try-catch или функциональном блоке попытки для производного класса, и некоторые или все его основы, обработчики должны быть упорядочены наиболее выведенные базовому классу. |
| 15-3-7 | Где несколько обработчиков обеспечиваются в одном операторе try-catch или функциональном блоке попытки, любой замещающий знак (вместилище), обработчик должен произойти в последний раз. |
| 15-5-1 | Деструктор класса не должен выходить за исключением. |
| 15-5-2 | Где объявление функции включает спецификацию исключения, функция должна только быть способна к выдаванию исключения обозначенного типа (типов). |
Предварительная обработка директив
| Правило | Описание |
|---|---|
| 16-0-1 | Директивам #include в файле должны только предшествовать другие директивы препроцессору или комментарии. |
| 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 директива должна сопровождаться или <имя файла> или последовательность "имени файла". |
| 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 и атолл от библиотеки <cstdlib> не должны использоваться. |
| 18-0-3 | Аварийное прекращение работы библиотечных функций, выход, getenv и система от библиотеки <cstdlib> не должны использоваться. |
| 18-0-4 | Функции обработки времени библиотеки <ctime> не должны использоваться. |
| 18-0-5 | Неограниченные функции библиотеки <cstring> не должны использоваться. |
| 18-2-1 | Макрос offsetof не должен использоваться. |
| 18-4-1 | Динамическое выделение памяти кучи не должно использоваться. |
| 18-7-1 | Погрузочно-разгрузочное оборудование сигнала <csignal> не должно использоваться. |
Диагностическая библиотека
| Правило | Описание |
|---|---|
| 19-3-1 | Ошибочный индикатор errno не должен использоваться. |
Библиотека ввода/вывода
| Правило | Описание |
|---|---|
| 27-0-1 | Потоковый ввод / выходная библиотека <cstdio> не должен использоваться. |