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

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

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

N.Определение JSF® ++Polyspace® Implementation
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выходgetenv и system от библиотеки <stdlib.h> не буду использоваться.

abortвыходgetenv и system не должен использоваться в качестве макроса или глобальной переменной с внешним "C" рычажным устройством.
25

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

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

Предварительная обработка директив

N.JSF ++ определениеРеализация Polyspace
26Только следующие директивы препроцессору должны быть used: #ifndefDefine , #endifВключение. 
27

#ifndefDefine и #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Каждый файл реализации должен включать заголовочные файлы, которые исключительно задают подставляемые функции, типы и используемые шаблоны.

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

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

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

Это средство проверки деактивировано в Polyspace по умолчанию как Вы Анализ кода. Смотрите Средства проверки, Деактивированные в Polyspace, когда Вы Кодируете Анализ По умолчанию (Polyspace Bug Finder Access).

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 начнется с прописной буквы. Все буквы других будут нижним регистром.

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

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

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

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

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

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

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 ^=

  • Префиксный operator++

  • Префиксный operator--

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

Никакое специальное сообщение, если тип не соответствует.

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

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

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

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

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

  • Множественное наследование на общедоступной реализации не должно быть позволено: <public_base_class> не интерфейс.

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

  • <protected_base_class_2> не интерфейсы.

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

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

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

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

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

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

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

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

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

Шаблоны

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

Функции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Комментарии

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

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

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

  • Доксиджен комментирует начало с /**, /*!, /// или //!.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примечание

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

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

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

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

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

  • Невостребованный static или extern функции

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

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

Это средство проверки деактивировано в Polyspace по умолчанию как Вы Анализ кода. Смотрите Средства проверки, Деактивированные в Polyspace, когда Вы Кодируете Анализ По умолчанию (Polyspace Bug Finder Access).

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

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

Это средство проверки деактивировано в Polyspace по умолчанию как Вы Анализ кода. Смотрите Средства проверки, Деактивированные в 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 инициализации. и переключите случаи. символьные константы позволены. Не сообщает относительно параметра нетипа шаблонов.

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

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

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

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

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

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

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

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

187Все непустые операторы должны потенциально иметь побочный эффект. 
188Метки не будут использоваться, кроме операторов switch. 
189goto оператор не должен использоваться. 
190continue оператор не должен использоваться. 
191break оператор не должен использоваться (кроме отключить случаи оператора switch). 
192Весь if, else if построения будут содержать любого итоговый else пункт или комментарий, указывающий, почему итоговый else пункт не необходим.else if должен содержать else пункт.
193Каждый непустой case пункт в операторе switch должен быть отключен с break оператор. 
194Весь switch операторы, которые не намереваются протестировать на каждую перечислимую величину, должны содержать итоговый default пункт.Отчеты только для пропавших без вести default.
195switch выражение не будет представлять булево значение. 
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++ должен использоваться с критическим по отношению к безопасности (i.e. 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Если функция возвратит информацию об ошибке, то та информация об ошибке будет протестирована.
118

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

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

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

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

Комментарии

N.JSF ++ определение
128Комментарии, что действия документа или источники (e.g. таблицы, фигуры, абзацы, и т.д.) за пределами зарегистрированного файла не будет позволен.
129Комментарии в заголовочных файлах должны описать внешне видимое поведение функций или зарегистрированных классов.
130Цель каждой линии исполняемого кода должна быть объяснена комментарием, несмотря на то, что один комментарий может описать больше чем одну строку кода.
131Нужно постараться не утверждать в комментариях, что лучше утверждается в коде (i.e. просто не повторяйте то, что находится в коде).
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Алгоритмы не должны делать предположения относительно того, как данные представлены в памяти (e.g. обратный порядок байтов по сравнению с прямым порядком байтов, подобъект базового класса, заказывающий в производных классах, нестатическом упорядоченном расположении элемента данных через спецификаторы доступа, и т.д.).
210.1Алгоритмы не должны делать предположения относительно порядка выделения нестатических элементов данных разделенными спецификатором доступа.
211Алгоритмы не должны принимать, что короткие замыкания, ints, longs, плавания, удваиваются или долго удваиваются, начинаются в конкретных адресах.
212Потеряйте значимость или переполнитесь, функционирование не должно зависеться ни от каким специальным способом.
214Предположение, что нелокальные статические объекты, в отдельных модулях перевода, инициализируются в специальном порядке, не должно быть сделано.

Факторы КПД

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

Разное

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

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

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