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

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

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

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

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

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

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

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

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

Среда

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

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

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

Сообщает диграф. Если уровень правила будет установлен в предупреждение, диграф будет позволен, даже если это не будет поддержано в -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

Макрос 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Только следующие директивы препроцессору должны быть used: #ifndef, #define, #endif, #include. 
27

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

Обнаруживает шаблоны #if !defined, #pragma once, #ifdef и missing #define.
28#ifndef и директивы препроцессору #endif будут только использоваться, как задано в Правиле 27 AV предотвратить несколько включений того же заголовочного файла.Обнаруживает любое использование, которое не выполняет Правило 27 AV. Принятие 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Все добавления отступа будут по крайней мере двумя пробелами и будут сопоставимы в том же исходном файле.Отчеты, когда добавление отступа оператора не является по крайней мере двумя пробелами больше, чем оператор, содержащий его. Не сообщает плохое добавление отступа между открытием фигурных скобок после того, если/еще,/в то время как, поскольку, и в то время как операторы. NB: в итоговом релизе это примет любое добавление отступа
46Заданные пользователями идентификаторы (внутренний и внешний) не будут полагаться на значение больше чем 64 символов. 
47Идентификаторы не начнутся с символа подчеркивания '_'. 
48

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

  • Только смесь случая

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

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

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

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

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

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

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

60Фигурные скобки ("{}"), которые заключают блок, будут помещены в тот же столбец на отдельных строках непосредственно до и после блока.Обнаруживает тот блок операторов, которым фигурные скобки должны быть в тех же столбцах.
61Фигурные скобки ("{}"), которые заключают блок, не будут иметь ничего иного на строке кроме комментариев. 
62Разыменовать оператор '*' и операция вычисления адреса ‘&’ будет непосредственно соединен со спецификатором типа.Отчеты, когда существует пробел между типом и "*" "&" для переменных, параметров и полевого объявления.
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

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

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

Отчеты, когда количество “новых”, названных в конструкторе, больше, чем количество, “удаляют” названный в его деструкторе.

Примечание

Нарушение повышено, даже если “новый” выполнен “если/еще”.

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

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

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

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

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

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

operator= operator+= operator-= operator*= operator >>= operator <<= operator /= operator %= operator |= operator &= operator ^= prefix operator++ prefix 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(), должно быть помещено в некоторое пространство имен.

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

99Пространства имен не будут вложены больше чем два уровня глубоко. 

Шаблоны

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

Функции

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

О прямой рекурсии сообщают статически. О косвенной рекурсии сообщают через программное обеспечение.

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

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

121Только функции с 1 или 2 операторами должны быть рассмотрены кандидатами на подставляемые функции.Подставляемые функции отчетов больше чем с 2 операторами.

Комментарии

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

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

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

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

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

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

136Объявления должны быть в самом маленьком выполнимом осциллографе.

Отчеты, когда:

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

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

Примечание

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

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

137Все объявления в осциллографе файла должны быть статичными, если это возможно. 
138Идентификаторы не должны одновременно иметь и внутренней и внешней связи в том же модуле перевода. 
139Внешние объекты не будут объявлены больше чем в одном файле.Отчеты все двойные объявления в модуле перевода. Отчеты, когда локализация объявления не является тем же самым во всех модулях перевода.
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Строковый литерал не должен быть изменен.

Сообщите, когда char*, char[] или тип string будут использоваться не в качестве 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

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

Отчеты non-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) должны использоваться вместо традиционных бросков C-стиля. 

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

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

Сделанный с серыми регистрациями программного обеспечения.

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

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

Выражения

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

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

  • отдельно

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

  • условие

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

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

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

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

Отчеты, когда:

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

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

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

Отчеты, когда:

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

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

  • К энергозависимой переменной получают доступ несколько раз

Примечание

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

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 'd соответственно для каждого компилятора и этих имен типов, используемых в коде.

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

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

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

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

Reports:p + Ip - Ip++p--p+=p-=

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

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

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

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

Правила

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

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

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

5

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

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

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

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

Среда

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

Библиотеки

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

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

N.JSF ++ определение
34Заголовочные файлы должны содержать логически связанные объявления только.
36Зависимости от компиляции должны быть минимизированы, если это возможно.
37Заголовок (включает) файлы, должен включать только те заголовочные файлы, которые требуются для них успешно скомпилировать. Файлы, которые только используются связанным .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Общедоступное наследование будет использоваться, чтобы реализовать отношения “isa”.
92

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

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

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

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

93“имеет -”, или “реализован с точки зрения” отношений, будет смоделирован через членство или непубличное наследование.

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

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

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

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

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

Шаблоны

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

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

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

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

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

Функции

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

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

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

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

118

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

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

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

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

Комментарии

N.JSF ++ определение
127

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

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

128Комментарии, что действия документа или источники (например, таблицы, фигуры, абзацы, и т.д.) за пределами зарегистрированного файла не будут позволены.
129Комментарии в заголовочных файлах должны описать внешне видимое поведение функций или зарегистрированных классов.
130Цель каждой строки исполняемого кода должна быть объяснена комментарием, несмотря на то, что один комментарий может описать больше чем одну строку кода.
131Нужно постараться не утверждать в комментариях, что лучше утверждается в коде (т.е. просто не повторяйте то, что находится в коде).
132Каждое объявление переменной, определение типа, перечислимая величина и элемент структуры будут прокомментированы.
134Предположения (ограничения), сделанные функциями, должны быть зарегистрированы в преамбулу функции.

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

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

Типы

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, longs, плавания, удваиваются или долго удваиваются, начинаются в конкретных адресах.
212Потеряйте значимость или переполнитесь, функционирование не должно зависеться ни от каким специальным способом.
214Предположение, что нелокальные статические объекты, в отдельных модулях перевода, инициализируются в специальном порядке, не должно быть сделано.

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

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

Разное

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

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

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