Правила кодирования AV C++ JSF

Поддерживаемые правила кодирования JSF C++

Размер и сложность кода

N.JSF®+ + ОпределениеPolyspace® Реализация
1Любая одна функция (или метод) будет содержать не более 200 логических исходных строк кода (L-SLOC).

Сообщение в файле отчета:

<function name> имеет <num> логические исходные строки кода.

3Все функции должны иметь число цикломатической сложности 20 или менее.

Сообщение в файле отчета:

<function name> имеет цикломатическое число сложности, равное <num>.

Окружение

N.Определение JSF++Реализация Polyspace
8Весь код должен соответствовать стандарту ISO/IEC 14882:2002 (E) C++.Сообщает о сообщении об ошибке компиляции
9Будут использоваться только символы, указанные в основном исходном наборе символов C++. 
11Триграфы не будут использоваться. 
12Следующие диграфы не будут использоваться: <%, %>, <:, :>, %:, %:%:.

Сообщение в файле отчета:

Следующий диграф не будет использоваться: <digraph>.

Сообщает диграф. Если для уровня правил задано значение warning, диграф будет разрешен, даже если он не поддерживается в -compiler iso.

13Многобайтовые символы и широкие строковые литералы использоваться не будут.Создание отчетов о L'c', L"string", и использование wchar_t.
14Буквальные суффиксы должны использовать заглавные, а не строчные буквы. 
15Предусматриваются средства для проверки во время выполнения (оборонительное программирование).Выполнено с проверками программного обеспечения.

Библиотеки

N.Определение JSF++Реализация Polyspace
17

Индикатор ошибки errno не должны использоваться.

errno не следует использовать в качестве макроса или глобальной связи с внешним редактированием «C».
18

Макрос offsetof, в библиотечных <stddef.h>, не должны использоваться.

offsetof не следует использовать в качестве макроса или глобальной связи с внешним редактированием «C».
19

<locale.h> и setlocale функция не должна использоваться.

setlocale и localeconv не следует использовать в качестве макроса или глобальной связи с внешним редактированием «C».
20

The setjmp макрос и longjmp функция не должна использоваться.

setjmp и longjmp не следует использовать в качестве макроса или глобальной связи с внешним редактированием «C».
21

Средства обработки сигналов <signal.h> не должны использоваться.

signal и raise не следует использовать в качестве макроса или глобальной связи с внешним редактированием «C».
22

Библиотека ввода/вывода <stdio.h> не должны использоваться.

все стандартные функции <stdio.h> не следует использовать в качестве макроса или глобальной связи с внешним редактированием «C».
23

Библиотека функционирует atof, atoi и atol из библиотечных <stdlib.h> не должны использоваться.

atof, atoi и atol не следует использовать в качестве макроса или глобальной связи с внешним редактированием «C».
24

Библиотека функционирует abort, exit, getenv и system из библиотечных <stdlib.h> не должны использоваться.

abort, exit, getenv и system не следует использовать в качестве макроса или глобальной связи с внешним редактированием «C».
25

Функции обработки времени библиотечных <time.h> не должны использоваться.

clock, difftime, mktime, asctime, ctime, gmtime, localtime и strftime не следует использовать в качестве макроса или глобальной связи с внешним редактированием «C».

Директивы предварительной обработки

N.Определение JSF++Реализация Polyspace
26Должны использоваться только следующие директивы препроцессора: #ifndef, #define, #endif, #include. 
27

#ifndef, #define и #endif будет использоваться для предотвращения нескольких включений одного и того же заголовочного файла. Другие методы предотвращения нескольких включений заголовочных файлов не будут использоваться.

Обнаруживает шаблоны #if !defined, #pragma once, #ifdef, и отсутствующие #define.
28The #ifndef и #endif директивы препроцессора будут использоваться только как определено в AV Rule 27, чтобы предотвратить несколько включений одного и того же заголовочного файла.Обнаруживает любое использование, которое не соответствует AV-правилу 27. Принимая, что 35/27 не нарушается, сообщает только #ifndef.
29The #define директива препроцессора не должна использоваться для создания встроенных макросов. Вместо этого должны использоваться встроенные функции.

Правило разделено на две части: определение макрофункции (29.def) и вызов макрофункции (29.use).

Сообщения в файле отчета:

  • 29.1: The #define директива препроцессора не должна использоваться для создания встроенных макросов.

  • 29.2 Вместо встроенных макросов должны использоваться встроенные функции.

30The #define директива препроцессора не должна использоваться для определения постоянных значений. Вместо этого, const квалификатор должен применяться к объявлениям переменных для задания постоянных значений.Отчеты #define простых констант.
31The #define директива препроцессора будет использоваться только как часть метода для предотвращения нескольких включений одного и того же заголовочного файла.Обнаруживает использование #define которые не используются для защиты от множественного включения, принимая, что правила 35 и 27 не нарушаются.
32The #include директива препроцессора будет использоваться только для включения файлов заголовков (* .h). 

Заголовочные файлы

N.Определение JSF++Реализация Polyspace
33The #include директива должна использовать <filename.h> обозначение для включения заголовочных файлов. 
35Заголовочный файл будет содержать механизм, который предотвращает несколько включений себя. 
39Заголовочные файлы (*.h) не будет содержать определений переменных, отличных от const, или определений функций.Сообщает определения глобальных переменных/функции в заголовке.

Стиль

N.Определение JSF++Реализация Polyspace
40Каждый файл реализации должен включать файлы заголовков, которые однозначно определяют встроенные функции, типы и используемые шаблоны.

Сообщает, когда тип, шаблон или встроенная функция заданы в исходном файле.

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

41Исходные линии будут храниться не более 120 символов. 
42Каждый оператор выражения будет находиться в отдельной линии.Отчеты, когда два последовательных оператора выражения находятся в одной линии (если только операторы не являются частью определения макроса).
43Следует избегать вкладок. 
44Все отступы будут состоять по крайней мере из двух пространств и будут непротиворечивыми в одном исходном файле.Сообщает, когда отступление оператора не по крайней мере на два пробела больше, чем содержащийся в нем оператор. Не сообщает о плохом отступе между открывающими скобками, следующими за операторами if/else, do/while, for и while. NB: в финальном релизе он примет любое отступление
46Заданные пользователем идентификаторы (внутренний и внешний) не будут полагаться на значимость более 64 символов.

Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access).

47Идентификаторы не начнутся с символа подчеркивания '_'. 
48

Идентификаторы не будут отличаться:

  • Только смесь кейсов

  • Наличие/отсутствие символа подчеркивания

  • обмен буквой 'O'; с номером '0' или буквой 'D'

  • обмен буквой 'I'; с номером '1' или буквой 'l'

  • Обмен буквы 'S' с номером '5'

  • Обмен буквы 'Z' с цифрой 2

  • Обмен буквы 'n' с буквой 'h'

Проверяется независимо от возможностей. Не проверяется между макросами и другими идентификаторами.

Сообщения в файле отчета:

  • Идентификатор Idf1 (file1.cpp line l1 column c1) и Idf2 (file2.cpp line l2 column c2) только отличаются наличием/отсутствием символа подчеркивания.

  • Идентификатор Idf1 (file1.cpp line l1 column c1) и Idf2 (file2.cpp line l2 column c2) отличаются только смесью случаев.

  • Идентификатор Idf1 (file1.cpp line l1 column c1) и Idf2 (file2.cpp line l2 column c2) отличаются только буквой O, с числом 0.

50

Первое слово имени класса, структуры, пространства имен, перечисления или типа, созданное с помощью typedef начнется с заглавной буквы. Все остальные буквы будут строчными.

Сообщения в файле отчета:

  • Первое слово имени класса начинается с заглавной буквы.

  • Первое слово пространства имен класса начнется с заглавной буквы.

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

51Все буквы, содержащиеся в именах функций и переменных, будут полностью составлены из строчных букв.

Сообщения в файле отчета:

  • Все буквы, содержащиеся в именах переменных, будут полностью составлены из строчных букв.

  • Все буквы, содержащиеся в именах функции, будут полностью составлены из строчных букв.

52Идентификаторы постоянных значений и значений перечислителя должны быть строчными.

Сообщения в файле отчета:

  • Идентификатор значения счетчика должен быть строчным.

  • Идентификатор для параметра константы шаблона должен быть строчным.

53Заголовочные файлы всегда будут иметь расширение имени файла ".h".

.H разрешено, если задана опция -dos.

53.1Следующие последовательности символов не должны отображаться в именах заголовочных файлов: ', \, /*, //, или ". 
54Файлы реализации всегда будут иметь расширение имени файла. «cpp».Не чувствительный к регистру, если вы задаете опцию -dos.
57Публичные, защищенные и частные разделы класса будут объявлены в таком порядке. 
58При объявлении и определении функций с более чем двумя параметрами начальная круглая скобка и первый аргумент будут записаны в ту же линию, что и имя функции. Каждый дополнительный аргумент будет записан в отдельную линию (с закрывающей круглой скобкой непосредственно после последнего аргумента).Обнаруживает, что два параметра находятся не в одной линии, Первый параметр должен быть в той же линии, что и имя функции. Не проверяет наличие закрывающих круглых скобок.
59Операторы, образующие тело если, иначе, в то время как, сделать... в то время как или для оператора всегда заключаются в скобки, даже если скобки образуют пустой блок.

Сообщения в файле отчета:

  • Операторы, образующие корпус оператора if, всегда должны быть заключены в скобки.

  • Операторы, образующие текст оператора об ином, всегда заключаются в скобки.

  • Операторы, образующие корпус некоторое время оператора, всегда должны быть заключены в скобки.

  • Операторы, образующие тело ду... в то время как оператор всегда должно быть заключено в скобки.

  • Операторы, образующая корпус оператора, всегда должны быть заключены в скобки.

60Скобки ("{}"), который окружает блок, будет помещен в один столбец, на отдельные линии непосредственно до и после блока.Определяет, что скобки блока оператора должны быть в тех же столбцах.
61Скобки ("{}"), который заключает блок, не будет иметь ничего другого в линии, кроме комментариев. 
62Оператор dereference «*» и адрес оператора «&» будут непосредственно связаны со спецификатором типа.Сообщает, когда существует пространство между типом и «*» «&» для переменных, параметров и объявления полей.
63Пространства не будут использоваться ни вокруг. «» или «- >», ни между унарными операторами и операторами.

Сообщает, когда следующие символы не подключены непосредственно к пустому пространству:

  • .

  • ->

  • !

  • ~

  • -

  • ++

Обратите внимание, что о нарушении будет сообщено для. «», используемого в определении с плавающей/двойной точкой.

Классы

N.Определение JSF++Реализация Polyspace
67Общие и защищенные данные должны использоваться только в структурах, а не в классах. 
68Ненужные неявно сгенерированные функции представителей должны быть явно запрещены.Сообщает, что конструктор по умолчанию, оператор назначения, конструктор копирования или деструктор не объявлены.
71.1Виртуальные функции класса не должны вызываться ни от его деструктора, ни от любого из его конструкторов.Сообщает, когда конструктор или деструктор непосредственно вызывает виртуальную функцию.
74Инициализация нестатических членов класса будет выполнена через список инициализации представителя, а не путем назначения в теле конструктора.

Все данные должны быть инициализированы в списке инициализации, за исключением массива. Не сообщает, что назначение существует в ctor тело.

Сообщение в файле отчета:

Инициализация нестатических членов класса "<field>"будет выполняться через список инициализации представителя.

75Представители списка инициализации должны быть указаны в том порядке, в котором они объявлены в классе. 
76Конструктор копирования и оператор назначения должны быть объявлены для классов, содержащих указатели на элементы данных или нетривиальные деструкторы.

Сообщения в файле отчета:

  • no copy constructor and no copy assign

  • no copy constructor

  • no copy assign

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

77.1Определение функции представителя не должно содержать аргументов по умолчанию, которые генерируют сигнатуру, идентичную сигнатуре неявно объявленного конструктора копии для соответствующего класса/структуры.Не сообщает, когда существует явный конструктор копирования.
78Все базовые классы с виртуальной функцией должны определять виртуальный деструктор. 
79Все ресурсы, полученные классом, освобождаются деструктором класса.

Сообщает, что количество «новых» вызовов в конструкторе больше, чем количество «удалить» вызовов в деструкторе.

Примечание

Нарушение возникает, даже если «new» сделано в «if/else».

81Оператор назначения должен правильно обрабатывать самоопределение

Отчеты, когда тело назначения копирования не начинается с "if (this != arg)

Нарушение не возникает, если пустой else оператор следует ifили тело содержит только оператор возврата.

Нарушение возникает, когда if оператор сопровождается оператором, отличным от оператора возврата.

82Оператор назначения возвращает ссылку на *this.

Следующие операторы должны вернуться *this по методу и *first_arg по простой функции:

  • operator=

  • operator+=

  • operator-=

  • operator*=

  • operator >>=

  • operator <<=

  • operator /=

  • operator %=

  • operator |=

  • operator &=

  • operator ^=

  • Префикс- operator++

  • Префикс- operator--

Не сообщает, когда возврат не существует.

Нет специального сообщения, если тип не совпадает.

Сообщения в файле отчета:

  • Оператор назначения возвращает ссылку на *this.

  • Оператор назначения возвращает ссылку на свою первую аргу.

83Оператор назначения должен назначить все представители данных и основ, которые влияют на инвариант класса (элемент данных, представляющий кэш, например, не должен быть скопирован).Сообщает, когда назначение копирования не присваивает всех представителей данных. В производном классе он также сообщает, когда назначение копирования не вызывает наследуемые назначения копирования.
88Многократное наследование допускается только в следующей ограниченной форме: n интерфейсы плюс m частные реализации, плюс, самое большее, одна защищенная реализация.

Сообщения в файле отчета:

  • Множественное наследование при публичной реализации не допускается: <public_base_class> не является интерфейсом.

  • Множественное наследование при защищенной реализации не допускается: <protected_base_class_1>.

  • <protected_base_class_2> не являются интерфейсами.

88.1Виртуальная основа с учетом состояния должна быть явно объявлена в каждом производном классе, который обращается к нему. 
89Базовый класс не должен быть одновременно виртуальным и невиртуальным в одной иерархии. 
94Унаследованная невиртуальная функция не должна быть переопределена в производном классе.

Не сообщает о деструкторе.

Сообщение в файле отчета:

Наследуемая невиртуальная функция %s не должны быть переопределены в производном классе.

95Унаследованный параметр по умолчанию никогда не будет переопределен. 
96Массивы не должны обрабатываться полиморфно.Сообщает арифметику указателя и массив, такие как доступ к выражениям, остроконечный тип которых используется в качестве базового класса.
97Массивы не должны использоваться в интерфейсе.Только для предотвращения распада массива в указатель. Не проверен на частных методах
97.1Ни операнд оператора равенства (== или !=) должен быть указателем на функцию виртуального представителя.Отчеты == и != на указатель представителя функцию полиморфных классов (не может статически определить, является ли она виртуальной или нет), кроме тех случаев, когда один аргумент является нулевой константой.

Пространства имен

N.Определение JSF++Реализация Polyspace
98Каждое нелокальное имя, кроме main(), должно быть помещено в некоторое пространство имен.

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

99Пространства имен не будут вложены глубиной более двух уровней. 

Шаблоны

N.Определение JSF++Реализация Polyspace
104Специализация шаблона декларируется до ее использования.Сообщает фактическое сообщение об ошибке компиляции.

Функции

N.Определение JSF++Реализация Polyspace
107Функции должны всегда объявляться в возможностях файла. 
108Функции с переменным количеством аргументов не должны использоваться. 
109Определение функции не должно помещаться в спецификацию класса, если функция не предназначена для встраивания.Сообщает, когда «inline» не находится в определении функции представителя внутри определения класса.
110Функции с более чем 7 аргументами не будут использоваться. 
111Функция не должна возвращать указатель или ссылку на нестатический локальный объект.Обнаружены простые случаи без эффекта псевдонима.
113Функции будут иметь одну выходную точку.Отчеты сначала возвращаются, или один раз на функцию.
114Все точки выхода функций возврата стоимости должны быть через операторы возврата. 
116Маленькие аргументы конкретного типа (два или три слова в размере) должны передаваться по значению, если изменения, внесенные в формальные параметры, не должны отражаться в функции вызова.Сообщите о ссылках на постоянные параметры с sizeof <= 2 * sizeof(int). Не сообщает для copy-constructor.
117

Аргументы должны передаваться по ссылке, если значения NULL невозможны:

  • 117.1: Объект должен быть передан как const T& если функция не должна изменять значение объекта.

  • 117.2: Объект должен быть передан как T& если функция может изменить значение объекта.

Шашка помечает параметр, переданный указателем, если параметр не сравнивается с NULL или nullptr в теле функции. Отсутствие проверки на null указывает, что параметр не может быть null и поэтому может быть передан по ссылке.

Шашка не поднимает нарушения:

  • Если параметр передается с помощью смарт-указателя.

    Рассматриваются только необработанные указатели.

  • Если параметр указателя не разыменован в функции.

119Функции не должны вызываться, прямо или косвенно (т.е. рекурсия не допускается).

Чекер сообщает о каждой функции, которая вызывает себя, прямо или косвенно. Даже если несколько функций участвуют в одном цикле рекурсии, каждая функция сообщается индивидуально.

Общее количество циклов рекурсии можно вычислить с помощью метрики сложности кода Number of Recursions. Обратите внимание, что в отличие от проверки, метрика также рассматривает неявные вызовы, например, конструкторам, сгенерированным компилятором, во время создания объекта.

121Кандидатами для встроенных функций должны считаться только функции с 1 или 2 операторами.Сообщает о встроенных функциях с более чем 2 операторами.
122Тривиальные функции доступа и мутатора должны быть встроены.

Чекер использует следующие критерии, чтобы определить, является ли метод тривиальным:

  • Метод accessor тривиален, если он не имеет параметров и содержит один return оператор, который возвращает нестатический представитель данных или ссылку на нестатический представитель данных.

    Тип возврата метода должен точно совпадать или быть ссылкой на тип представителя данных.

  • Метод мутатора тривиален, если у него есть void возвращает тип, один параметр и содержит один оператор назначения, который присваивает параметр нестатическому представителю данных.

    Тип параметра должен точно совпадать или быть ссылкой на тип представителя данных.

Проверка сообщает о тривиальных методах доступа и мутатора, определенных вне их классов без inline ключевое слово.

Проверка не помечает методы шаблона или виртуальные методы.

Комментарии

N.Определение JSF++Реализация Polyspace
126Только действительные комментарии стиля C++ (//) должны использоваться. 
127Код, который не используется (комментируется), должен быть удален.

Чекер использует внутреннюю эвристику, чтобы обнаружить закомментированный код. Для образца такие символы, как #, ;, { или } указать комментарии, которые потенциально могут содержать код. Эти комментарии затем оцениваются по другим метрикам, чтобы определить вероятность маскировки кода как комментария. Для образца несколько последовательных слов без символа между ними уменьшают эту вероятность.

Шашка не помечает следующие комментарии, даже если они содержат код:

  • Комментарии Doxygen, начинающиеся с /**, /*!, /// или //!.

  • Комментарии, которые повторяют один и тот же символ несколько раз, например, символ = здесь:

    // ================================
    // A comment
    // ================================*/

  • Комментарии к первой линии файла.

  • Комментарии, которые смешивают стиль C (/* */) и стиль C++ (//).

Чекер считает, что эти комментарии предназначены для целей документации или были внесены преднамеренно с некоторой дальновидностью.

133Каждый исходный файл будет документироваться вступительным комментарием, который содержит информацию о имени файла, его содержимом и любой необходимой для программы информацией (например, юридические операторов, информацию об авторских правах и т.д.).

Сообщает, что файл не начинается с двух строк с комментариями.

Примечание.Это правило нельзя аннотировать в исходном коде.

Декларации и определения

N.Определение JSF++Реализация Polyspace
135Идентификаторы во внутренних возможностях не должны использовать то же имя, что и идентификаторы во внешних возможностях, и поэтому скрывать этот идентификатор.

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

136Заявления должны находиться в наименьших допустимых возможностях.

Сообщает, когда:

  • Глобальная переменная используется только в одной функции.

  • Локальная переменная не используется в операторе (expr, return, init ...) того же уровня его объявления (в том же блоке) или не используется в двух подоператорах его объявления.

Примечание

  • Сообщаются неиспользованные переменные.

  • Инициализации в определении игнорируются (не считаются доступом)

137Все объявления в области файлов должны быть статическими, где это возможно.

Начиная с R2021a, эта проверка возникает на объявлениях нестатических объектов, которые вы используете только в одном файле. Чекер поднимается, даже если вы анализируете одиночный файл. Проверка не возникает на объявлениях объектов, которые остаются неиспользованными, таких как:

  • Неинстантированные шаблоны

  • Незакрытые static или extern функции

  • Незавершенные и неопределенные локальные функции

  • Неиспользованные типы и переменные

Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access).

138Идентификаторы не должны одновременно иметь как внутреннее так и внешнее редактирование в одном модуле перевода. 
139Внешние объекты не будут объявлены в нескольких файлах.

Сообщает обо всех повторяющихся объявлениях в модуле перевода. Сообщает, что локализация объявления отличается во всех модулях перевода.

Эта проверка деактивируется в Polyspace по умолчанию при анализе You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access).

140Спецификатор класса памяти регистров не должен использоваться. 
141Класс, структура или перечисление не будут объявлены в определении его типа. 

Инициализация

N.Определение JSF++Реализация Polyspace
142Все переменные должны быть инициализированы перед использованием.Выполнено с Неинициализированными проверками переменных в программном обеспечении.
144Скобки должны использоваться для указания и соответствия структуры в ненулевой инициализации массивов и структур.Это охватывает частичную инициализацию.
145В списке перечислителей '='конструкция не может использоваться для явной инициализации представителей, отличных от первого, если только все элементы не инициализированы явным образом.Генерирует один отчет для списка перечислителей.

Типы

N.Определение JSF++Реализация Polyspace
147Базовые битовые представления чисел с плавающей точкой ни в коем случае не должны использоваться программистом.Отчеты по слепкам с плавающими указателями (кроме void*).
148Перечисляемые типы должны использоваться вместо целых типов (и констант) для выбора из ограниченной серии вариантов.Сообщает, когда в коммутаторах используются не перечисляемые типы.

Константы

N.Определение JSF++Реализация Polyspace
149Восьмиугольные константы (кроме нуля) не должны использоваться. 
150Шестнадцатеричные константы будут представлены с помощью всех заглавных букв. 
151Числовые значения в коде использоваться не будут; вместо этого будут использоваться символические значения.

Сообщает о прямых числовых константах (кроме целого числа/числа с плавающей точкой значения 1, 0) в выражениях, не -const инициализаций. и случаи переключения. разрешены константы char. Не сообщает о шаблонах, не относящихся к типу параметра.

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

151.1Строковый литерал не должен быть изменен.

Флажки проверки правил присваивают строковые литералы:

  • Указатели кроме указателей на const объекты.

  • Массивы, которые не const-квалифицированный.

Переменные

N.Определение JSF++Реализация Polyspace
152В линии не допускается использование нескольких объявлений переменных.Сообщает, что два последовательных оператора объявления находятся в одной линии (если только операторы не являются частью определения макроса).

Объединения и битовые поля

N.Определение JSF++Реализация Polyspace
153Объединения не должны использоваться. 
154Битовые поля должны иметь только беззнаковые интегральные или перечисляемые типы. 
156Все представители структуры (или класса) должны быть названы и доступны только через их имена.Сообщает безымянные битовые поля (неназванные поля не разрешены).

Операторы

N.Определение JSF++Реализация Polyspace
157Операнд правой руки && или || оператор не должен содержать побочных эффектов.

Принимает, что правило 159 не нарушено.

Сообщения в файле отчета:

  • Операнд правой руки && оператор не должен содержать побочных эффектов.

  • Операнд правой руки || оператор не должен содержать побочных эффектов.

158

Операнды логического && или || должны быть скобками, если операнды содержат бинарные операторы.

Сообщения в файле отчета:

  • Операнды логического && должны быть скобками, если операнды содержат бинарные операторы.

  • Операнды логического || должны быть скобками, если операнды содержат бинарные операторы.

Исключение для: X || Y || Z , Z&&Y &&Z

159

Операторы ||, &&, и унарные & не должны быть перегружены.

Сообщения в файле отчета:

  • Унарный оператор и не должен быть перегружен.

  • Оператор || не должны быть перегружены.

  • Оператор && не должны быть перегружены.

160Выражение назначения используется только в качестве выражения в операторе выражения.Только простое назначение, не +=, ++, и т.д.
162Подписанные и неподписанные значения не должны смешиваться в арифметических или сравнительных операциях. 
163Не допускается использование беззнаковой арифметики. 
164Операнд правой руки оператора сдвига должен находиться между нулем и на единицу меньше ширины в битах левого операнда (включительно). 
164.1Левый операнд оператора правой смены не должен иметь отрицательного значения.Обнаруживает постоянные случаи +. Найдено программным обеспечением для динамических кейсов.
165Оператор унарного минуса не применяется к беззнаковому выражению. 
166The sizeof оператор не будет использоваться для выражений, содержащих побочные эффекты. 
168Оператор запятыми не должен использоваться. 

Указатели и ссылки

N.Определение JSF++Реализация Polyspace
169Указатели на указатели следует избегать, когда это возможно.Сообщает о указателях второго уровня, кроме аргументов основного.
170Не допускается использование более 2 уровней опосредования указателя.Отчеты только по переменным/параметрам.
171

Реляционные операторы не должны применяться к типам указателей, за исключением тех случаев, когда оба операнда имеют одинаковый тип и указывают на:

  • того же объекта,

  • та же функция,

  • представителей того же объекта, или

  • элементы того же массива (включая один за концом того же массива).

Сообщает, когда реляционный оператор используется для типов указателей (отклонения).
173Адрес объекта с автоматическим хранением не должен быть присвоен объекту, сохраняющемуся после прекращения существования объекта. 
174Указатель null не должен использоваться без ссылок.Выполнено с программным обеспечением проверки.
175Указатель не должен сравниваться с NULL или быть назначенным NULL; используйте обычные 0 вместо этого.Сообщает об использовании NULL макрос в контекстах указателей.
176

A typedef будет использоваться для упрощения синтаксиса программы при объявлении указателей на функцию.

Отчеты не typedef указатели на функции или указатели на представителя функции для типов переменных, полей, параметров. Возвращает тип функции, приведение и спецификацию исключения.

Преобразования типов

N.Определение JSF++Реализация Polyspace
177Следует избегать пользовательских функций преобразования.

Сообщает пользовательскую функцию преобразования, неявный конструктор с одним параметром или значение по умолчанию для других (даже неопределенные таковые).

Не сообщает о copy-конструкторе.

Дополнительное сообщение для случая конструктора:

Этот конструктор должен быть помечен как «явный».

178

Литье вниз (отливка от основы до производного класса) допускается только с помощью одного из следующих механизмов:

  • Виртуальные функции, которые действуют как динамические слепки (скорее всего, полезные в относительно простых случаях).

  • Использование шаблона visitor (или аналогичного) (скорее всего, полезного в сложных случаях).

Сообщает явное литье вниз, dynamic_cast включено. (Паттер Visitor не имеет специального случая.)
179Указатель на виртуальный базовый класс не должен преобразовываться в указатель на производный класс.Сообщает об этом конкретном приведении вниз. Позволяет dynamic_cast.
180Неявное преобразование, которое может привести к потере информации, не должно использоваться.

Сообщает о следующих неявных отливках:

integer => smaller integer unsigned => smaller or eq signed signed => smaller or eq un-signed integer => float float => integer

Не сообщает для приведения к bool отчеты для неявного приведения к константе, выполненной с опцией -scalar-overflows-checks signed-and-unsigned

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

181Избыточные явные отливки не будут использоваться.Отчеты бесполезный актерский состав: cast T to T. Приведения к эквивалентным typedefs также сообщаются.
182Отливка типов от любого типа к указателям или от указателей не должна использоваться.Не сообщает, когда применяется правило 181.
184Числа с плавающей точкой не должны преобразовываться в целые числа, если такое преобразование не является заданным алгоритмическим требованием или необходимым для оборудования интерфейса.Отчеты float->int преобразования. Не сообщает о неявных таковых.
185Стили C++ (const_cast, reinterpret_cast, и static_cast) должны использоваться вместо традиционных отливок в стиле С. 

Стандарты регулирования потока

N.Определение JSF++Реализация Polyspace
186Не должно быть недостижимого кода.

Сделано с серыми проверками в программном обеспечении.

Bug Finder и Code Prover по-разному проверяют это правило кодирования. Анализы могут привести к различным результатам.

187Все операторы без нуля потенциально должны иметь побочный эффект. 
188Метки не будут использоваться, кроме как в операторах switch. 
189The goto оператор не должно использоваться. 
190The continue оператор не должно использоваться. 
191The break оператор не должен использоваться (кроме как для прекращения использования оператора switch). 
192Все if, else if конструкции будут содержать либо окончательное else пункт или комментарий, указывающий, почему окончательное else пункт не является необходимым.else if должен содержать else пункт.
193Каждый непустой case пункт в операторе switch должен быть завершен break оператор. 
194Все switch операторы, которые не намерены проверять на каждое значение перечисления, должны содержать окончательное default пункт.Отчеты только для отсутствующих default.
195A switch выражение не будет представлять логическое значение. 
196Каждый switch оператор будет иметь как минимум два случая и потенциальный default. 
197Переменные с плавающей точкой не должны использоваться в качестве счетчиков цикла.Принимает параметр 1 цикла.
198Выражение инициализации в for цикл не будет выполнять никаких действий, кроме инициализации значения одной for параметр цикла.Сообщает, если loop параметр не может быть определен. Предполагает, что правило 200 не нарушено. The loop variable параметр принимается как переменная.
199Выражение с шагом в for цикл не будет выполнять никаких действий, кроме изменения параметра одного цикла на следующее значение для цикла.Принимает параметр 1 цикла (Правило 198), с типом, отличным от класса. Правило 200 не должно нарушаться, чтобы об этом правиле сообщалось.
200Ядро инициализирует или увеличивает выражения в for циклы не будут использоваться; a while вместо этого будет использоваться цикл. 
201Числовые переменные, используемые в цикле for для подсчета итерации, не должны изменяться в теле цикла.Принимает 1 параметр цикла (AV правило 198), и никакие псевдонимы не записываются.

Выражения

N.Определение JSF++Реализация Polyspace
202Переменные с плавающей точкой не должны проверяться на точное равенство или неравенство.Сообщает только о прямом равенстве/неравенстве. Проверка выполнена для всех выражений.
203Оценка выражений не должна приводить к переполнению/подтоку.Выполнено с проверками переполнения в программном обеспечении.
204

Одна операция с побочными эффектами должна использоваться только в следующих контекстах:

  • сам по себе

  • правая сторона назначения

  • условие

  • единственное выражение аргумента с побочным эффектом в вызове функции

  • условие цикла

  • условие переключателя

  • одна часть операции с цепочкой

Сообщает, когда:

  • Побочный эффект обнаружен в операторе возврата

  • Побочный эффект существует на одном значении, и только один операнд вызова функции имеет побочный эффект.

204.1Значение выражения должно быть тем же самым в любом порядке оценки, который позволяет стандарт.

Сообщает, когда:

  • Переменная записывается более одного раза в выражение

  • Переменная читается и записывается в подвыражениях

  • Доступ к переменной Volatile осуществляется более одного раза

Примечание

Операции чтения и записи, такие как++, рассматриваются только как запись.

205Недопустимое ключевое слово не должно использоваться, если нет прямого взаимодействия с оборудованием.Сообщает, используется ли изменчивое ключевое слово.

Выделение памяти

N.Определение JSF++Реализация Polyspace
206Выделение/изъятие из/в свободное хранилище (кучу) не должно происходить после инициализации.Сообщает о вызовах функций библиотеки C: malloc / calloc / realloc / free и все new/delete операторов в функциях или методах.

Обработка отказов

N.Определение JSF++Реализация Polyspace
208Исключения C++ не должны использоваться.Отчеты try, catch, throw spec, и throw.

Портативный код

N.Определение JSF++Реализация Polyspace
209

Основные типы int, short, long, float и double не должен использоваться, но эквиваленты удельной длины должны быть typedefсоответственно для каждого компилятора и этих имен типов, используемых в коде.

Позволяет использовать только основные типы через прямые typedefs.
213Никакая зависимость не должна быть помещена в выражениях в правилах приоритета оператора C++, ниже арифметических операторов.

Сообщает, что двоичная операция имеет один операнд, который не имеет круглых скобок и является операцией с низким уровнем приоритета.

Сообщает побитовые и сдвигает операторы, которые используются без круглых скобок и аргументов бинарной операции.

215Арифметика указателя не будет использоваться.

Отчеты: p + Ip - Ip++p--p+=p-=

Позволяет p[i].

Неподдерживаемые правила JSF++

Размер и сложность кода

N.Определение JSF++
2Не должно быть никакого самомодифицирующего кода.

Правила

N.Определение JSF++
4

Чтобы нарушить правило «should», разработчик должен получить следующее одобрение:

  • утверждение от руководителя по проектированию программного обеспечения (получено по согласованию модуль в инструменте CM разработки)

5

Чтобы нарушить правило «завещание» или «должен», разработчик должен получить следующие разрешения:

  • утверждение от руководителя по проектированию программного обеспечения (получено по согласованию модуль в инструменте CM разработки)

  • одобрение от менеджера программного продукта (получено по согласованию модуль в инструменте CM разработки)

6Каждое отклонение от правила «должен» должно быть задокументировано в файле, содержащем отклонение. Отклонения от этого правила не допускаются, несмотря на правило 5 AV.
7Утверждение не требуется для отклонения от правила «должен» или «будет», которое соответствует исключению, указанному в этом правиле.

Окружение

N.Определение JSF++
10Значения типов символов будут ограничены определенным и документированным подмножеством ISO 10646 1.

Библиотеки

N.Определение JSF++
16С критическим для безопасности кодом (например, SEAL 1) должны использоваться только библиотеки DO-178B уровня А [15] или SEAL 1 C/C + +.

Заголовочные файлы

N.Определение JSF++
34Заголовочные файлы должны содержать только логически связанные объявления.
36Зависимости компиляции должны быть минимизированы, когда это возможно.
37Файлы заголовка (include) должны включать только те файлы заголовка, которые требуются для их успешной компиляции. Файлы, которые используются только связанным файлом .cpp, должны помещаться в файл .cpp, а не в файл .h.
38Объявления классов, доступ к которым осуществляется только через указатели (*) или ссылки (&), должны предоставляться прямыми заголовками, которые содержат только прямое объявление.

Стиль

N.Определение JSF++
45Все слова в идентификаторе будут разделены символом «_».
49Все аббревиатуры в идентификаторе будут состоять из заглавных букв.
55Имя файла заголовка должно отражать логическую сущность, для которого он предоставляет объявления.
56

Имя файла реализации должно отражать логическую сущность, для которого он предоставляет определения, и иметь расширение. «cpp» (это имя обычно будет идентично файлу заголовка, который предоставляет соответствующие объявления).

Иногда для данная логическая сущность требуется более одного файла .cpp. В этих случаях следует добавить суффикс, чтобы отразить логическую дифференциацию.

Классы

N.Определение JSF++
64Интерфейс класса должен быть полным и минимальным.
65Структура должна использоваться, чтобы смоделировать сущность, который не требует инварианта.
66Класс должен использоваться, чтобы смоделировать сущность, который поддерживает инвариант.
69Функция представителя, которая не влияет на состояние объекта (его переменные образцы), будет объявлена const. Представители функции должны быть const по умолчанию. Только когда существует ясная, явная причина, должен быть опущен модификатор const на представителя функциях.
70У класса будут друзья, только когда функция или объект требует доступа к частным элементам класса, но не может быть представителем класса по логическим причинам или причинам эффективности.
70.1Объект не должен использоваться ненадлежащим образом до начала его жизни или после окончания его жизни.
71Вызовы видимой извне операции объекта, кроме его конструкторов, не допускаются до тех пор, пока объект не будет полностью инициализирован.
72

Инвариант для класса должен быть:

  • Часть постконденции каждого конструктора классов,

  • Часть предусловия деструктора классов (при наличии),

  • Часть предварительных обязательных условий и обязательных условий каждой другой публично доступной операции.

73Ненужные конструкторы по умолчанию не должны быть определены.
77Конструктор копирования должен скопировать все представители данных и основ, которые влияют на инвариант класса (элемент данных, представляющий кэш, например, не должен быть скопирован).
80Операторы копирования и назначения по умолчанию будут использоваться для классов, когда эти операторы предлагают разумную семантику.
84Перегрузка операторов будет использоваться экономно и обычным способом.
85Когда два оператора являются противоположными (такими как = = и! =), оба будут определены, а один будет определен в терминах другого.
86Конкретные типы должны использоваться для представления простых независимых концепций.
87Иерархии должны основываться на абстрактных классах.
90Широко используемые интерфейсы должны быть минимальными, общими и абстрактными.
91Публичное наследование будет использоваться для реализации отношений «is-a».
92

Подтип (публично выведенные классы) будет соответствовать следующим рекомендациям в отношении всех классов, участвующих в полиморфном присвоении различных образцов подкласса одной и той же переменной или параметру во время выполнения системы:

  • Предусловия производных методов должны быть по крайней мере такими же слабыми, как предусловия методов, которые они переопределяют.

  • Постконденции производных методов должны быть по крайней мере такими же сильными, как и постконденции методов, которые они переопределяют.

Другими словами, методы подкласса должны ожидать меньше и доставлять больше, чем методы базового класса, которые они переопределяют. Это правило подразумевает, что подтипы будут соответствовать Принципу Замещения Лискова.

93отношения «имеет-а» или «реализовано-реализовано-в-терминах» будут моделироваться членством или непопулярным наследованием.

Пространства имен

N.Определение JSF++
100

Элементы из пространства имен должны быть выбраны следующим образом:

  • использование объявления или явной проверки для нескольких (приблизительно пяти) имен,

  • использование директивы для многих имен.

Шаблоны

N.Определение JSF++
101

Шаблоны должны быть рассмотрены следующим образом:

  1. в отношении шаблона в отдельности с учетом допущений или требований, содержащихся в его аргументах.

  2. для всех функций, созданных с помощью фактических аргументов.

102Испытания шаблона должны быть созданы, чтобы охватить все фактические экземпляры шаблона.
103Проверки ограничений должны применяться к аргументам шаблона.
105Зависимость определения шаблона от контекстов экземпляра должна быть минимизирована.
106При необходимости должны быть сделаны специализации для типов указателей.

Функции

N.Определение JSF++
112Значения возврата функций не должны затенять владение ресурсами.
115Если функция возвращает информацию об ошибке, эта информация об ошибке будет проверена.
118

Аргументы должны передаваться через указатели, если возможны значения NULL:

  • 118.1 - Объект должен быть передан как const T* если его значение не должно быть изменено.

  • 118.2 - Объект должен быть передан как T* если его значение может быть изменено.

120Перегруженные операции или методы должны образовывать семейства, которые используют ту же семантику, имеют то же имя, ту же цель и которые дифференцируются формальными параметрами.
123Количество функций доступа и мутатора должно быть сведено к минимуму.
124Должны быть встроены функции тривиальной переадресации.
125Следует избегать ненужных временных объектов.

Комментарии

N.Определение JSF++
128Комментарии, которые не допускаются к документированию действий или источников (например, таблиц, рисунков, абзацев и т.д.) вне документируемого файла.
129Комментарии в файлах заголовков должны описывать внешне видимое поведение задокументированных функций или классов.
130Цель каждой строки исполняемого кода должна объясняться комментарием, хотя один комментарий может описать более чем одну строку кода.
131Следует избегать в комментариях того, что лучше заявлено в коде (т.е. не просто повторять то, что есть в коде).
132Каждое объявление переменной, typedef, значение перечисления и представитель структуры будут замечены.
134Допущения (ограничения), сделанные функциями, должны быть задокументированы в преамбуле функции.

Инициализация

N.Определение JSF++
143Переменные не будут введены, пока их можно будет инициализировать значимыми значениями. (См. также AV Rule 136, AV Rule 142 и AV Rule 73, касающиеся возможностей, инициализации перед использованием и конструкторов по умолчанию соответственно.)

Типы

N.Определение JSF++
146

Реализации с плавающей точкой должны соответствовать определенному стандарту с плавающей точкой.

Стандартом, который будет использоваться, является ANSI®/ IEEE® Стд 754 [1].

Объединения и битовые поля

N.Определение JSF++
155Битовые поля не будут использоваться для упаковки данных в слово с единственной целью экономии пространства.

Операторы

N.Определение JSF++
167Реализация целочисленного деления в выбранном компиляторе определяется, документируется и учитывается.

Преобразования типов

N.Определение JSF++
183Необходимо принять все возможные меры, чтобы избежать отливки типа.

Выражения

N.Определение JSF++
204

Одна операция с побочными эффектами должна использоваться только в следующих контекстах:

  1. сам по себе

  2. правая сторона назначения

  3. условие

  4. единственное выражение аргумента с побочным эффектом в вызове функции

  5. условие цикла

  6. условие переключателя

  7. одна часть операции с цепочкой

Выделение памяти

N.Определение JSF++
207Следует избегать использования неинкапсулированных глобальных данных.

Портативный код

N.Определение JSF++
210Алгоритмы не должны делать допущения относительно того, как данные представлены в памяти (например, большой энд по сравнению с маленьким эндом, упорядоченное расположение подобъектов базового класса в производных классах, нестатическое упорядоченное расположение представителей данных между спецификаторами доступа и т.д.).
210.1Алгоритмы не должны делать допущения относительно порядка распределения нестатических представителей данных, разделенных спецификатором доступа.
211Алгоритмы не должны принимать, что шорты, ints, lons, floats, double или длинные double начинаются по конкретным адресам.
212Функционирование подземного или переливного потока не должно зависеть каким-либо особым образом.
214Принимая, что нелокальные статические объекты, в отдельных модулях преобразования, инициализированы в специальном порядке не должны быть сделаны.

Факторы эффективности

N.Определение JSF++
216Программисты не должны пытаться преждевременно оптимизировать код.

Разное

N.Определение JSF++
217Ошибки во время компиляции и во время соединения должны быть предпочтительнее, чем ошибки времени выполнения.
218Уровни предупреждений компилятора будут установлены в соответствии с политиками проекта.

Проверка

N.Определение JSF++
219Все тесты, применяемые к интерфейсу базового класса, должны применяться также ко всем производным интерфейсам классов. Если производный класс представляет более сильные постконденсации/инварианты, то новые постконденсации/инварианты должны быть заменены в производных классовых тестах.
220Алгоритмы структурного покрытия должны применяться к сглаженным классам.
221Структурное покрытие класса в пределах иерархии наследования, содержащей виртуальные функции, должно включать проверку каждого возможного разрешения для каждого набора идентичных полиморфных ссылок.