exponenta event banner

Правила кодирования 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 не следует использовать в качестве макроса или глобального с внешней связью «С».
18

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Файлы заголовков

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

Стиль

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

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

Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.

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

Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access).

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

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

  • Только смесь вариантов

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

  • обмен буквой «О»; с номером «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 начнется с заглавной буквы. Все остальные буквы будут строчными.

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

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

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

Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.

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

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

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

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

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

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

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

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

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

.H допускается, если установлен параметр -dos.

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

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

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

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

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

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

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

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

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

  • .

  • ->

  • !

  • ~

  • -

  • ++

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

Классы

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

Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.

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

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

Примечание

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

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

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

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

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

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Ни один из операндов оператора равенства (== или !=) должен быть указателем на функцию виртуального члена.Отчеты == и != по указателю на функцию-член полиморфных классов (не может определить статически, является он виртуальным или нет), за исключением случая, когда один аргумент является константой null.

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

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

Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.

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

Шаблоны

N.Определение JSF++Внедрение Polyspace
104Перед использованием шаблона должна быть объявлена его специализация.Сообщает о фактическом сообщении об ошибке компиляции.

Функции

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

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

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

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

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

Средство проверки не вызывает нарушения:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Комментарии

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

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

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

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

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

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

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

  • Комментарии, сочетающие стиль C (/* */) и стиль C++ (//).

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

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

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

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

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

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

Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.

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

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

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

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

Примечание

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

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

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

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

  • Неподтвержденные шаблоны

  • Неуместный static или extern функции

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

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

Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access).

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

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

Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (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 инициализации. и переключить кейсы. допустимы константы символов. Не сообщает о шаблонах, не являющихся параметрами типа.

Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.

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Оператор «унарный минус» не применяется к неподписанному выражению. 
166 sizeof оператор не будет использоваться в выражениях, содержащих побочные эффекты. 
168Оператор запятой не используется. 

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

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

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

  • один и тот же объект,

  • той же функции,

  • члены одного и того же объекта, или

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

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

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

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

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

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

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

Не сообщает о конструкторе копии.

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

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

178

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

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

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

Отчеты с явным понижением, dynamic_cast включены. (Паттер посетителя не имеет особого случая.)
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

Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.

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

Стандарты регулирования расхода

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

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

Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты.

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

Выражения

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

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

  • сама по себе

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

  • условие

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

  • состояние контура

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

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

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

  • В операторе return обнаружен побочный эффект

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

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

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

  • Переменная записывается в выражение несколько раз

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

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

Примечание

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

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

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

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

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

  • одобрение со стороны ведущего разработчика программного обеспечения (получено с одобрения блока в инструменте разработки КМ)

5

Для нарушения правила волеизъявления или волеизъявления разработчик должен получить следующие разрешения:

  • одобрение со стороны ведущего разработчика программного обеспечения (получено с одобрения блока в инструменте разработки КМ)

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

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

Окружающая среда

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

Библиотеки

N.Определение JSF++
16С кодом безопасности (т.е. SEAL 1) должны использоваться только библиотеки DO-178B уровня A [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 в функциях-членах должен быть опущен.
70Класс будет иметь друзей только тогда, когда функция или объект требует доступа к частным элементам класса, но не может быть членом класса по причинам логики или эффективности.
70.1Объект не должен использоваться ненадлежащим образом до начала срока его службы или после его окончания.
71Вызовы внешне видимой операции объекта, кроме его конструкторов, не должны разрешаться до полной инициализации объекта.
72

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

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

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

  • Часть предварительного и последующего условий любой другой общедоступной операции.

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

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

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

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

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

93«has-a» или «is-implemented-in-te-of» отношения будут смоделированы через членство или непубличное наследование.

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

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-правило 136, AV-правило 142 и AV-правило 73, касающиеся области объявления, инициализации перед использованием и конструкторов по умолчанию соответственно.)

Типы

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

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

Используется стандарт ANSI ®/IEEE ® Std 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Алгоритмы не должны делать допущений относительно того, как данные представлены в памяти (например, big endian vs. little endian, порядок подобъектов базового класса в производных классах, нестатический порядок членов данных по спецификаторам доступа и т.д.).
210.1Алгоритмы не должны делать допущений относительно порядка распределения нестатических элементов данных, разделенных спецификатором доступа.
211Алгоритмы не должны предполагать, что по конкретным адресам начинаются шорты, вкрапления, наплавки, двойки или длинные двойки.
212Функционирование при неполном потоке или переполнении не должно зависеть каким-либо особым образом.
214Предполагая, что нелокальные статические объекты, в отдельных единицах перевода, инициализируются в особом порядке, делать не следует.

Соображения эффективности

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

Разное

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

Тестирование

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