| N. | Определение JSF ® + + | Внедрение Polyspace ® |
|---|---|---|
| 1 | Любая функция (или метод) будет содержать не более 200 логических исходных строк кода (L-SLOC). | Сообщение в файле отчета:
|
| 3 | Все функции должны иметь цикломатическое число сложности 20 или менее. | Сообщение в файле отчета:
|
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 8 | Все коды должны соответствовать стандарту ISO/IEC 14882:2002 (E) C++. | Сообщение об ошибке компиляции |
| 9 | Будут использоваться только символы, указанные в базовом наборе символов C++. | |
| 11 | Триграфы использоваться не будут. | |
| 12 | Следующие рисунки не будут использоваться: <%, %>, <:, :>, %:, %:%:. | Сообщение в файле отчета: Следующий диграф не будет использоваться: Сообщает диграф. Если для уровня правила задано значение warning, диграф будет разрешен, даже если он не поддерживается в |
| 13 | Многобайтовые символы и строковые литералы не будут использоваться. | Отчет L'c', L"string"и использование wchar_t. |
| 14 | Буквенные суффиксы должны использовать прописные, а не строчные буквы. | |
| 15 | Должна быть предусмотрена проверка времени выполнения (защитное программирование). | Выполнено с проверками в программном обеспечении. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 17 | Индикатор ошибки | errno не следует использовать в качестве макроса или глобального с внешней связью «С». |
| 18 | Макрос | offsetof не следует использовать в качестве макроса или глобального с внешней связью «С». |
| 19 |
| setlocale и localeconv не следует использовать в качестве макроса или глобального с внешней связью «С». |
| 20 | | setjmp и longjmp не следует использовать в качестве макроса или глобального с внешней связью «С». |
| 21 | Средства обработки сигналов | signal и raise не следует использовать в качестве макроса или глобального с внешней связью «С». |
| 22 | Библиотека ввода/вывода | все стандартные функции <stdio.h> не следует использовать в качестве макроса или глобального с внешней связью «С». |
| 23 | Функции библиотеки | atof, atoi и atol не следует использовать в качестве макроса или глобального с внешней связью «С». |
| 24 | Функции библиотеки | abort, exit, getenv и system не следует использовать в качестве макроса или глобального с внешней связью «С». |
| 25 | Функции обработки времени библиотеки | clock, difftime, mktime, asctime, ctime, gmtime, localtime и strftime не следует использовать в качестве макроса или глобального с внешней связью «С». |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 26 | Должны использоваться только следующие директивы препроцессора: #ifndef, #define, #endif, #include. | |
| 27 |
| Обнаружение шаблонов #if !defined, #pragma once, #ifdef, и отсутствует #define. |
| 28 | #ifndef и #endif директивы препроцессора будут использоваться, как определено в AV Rule 27, для предотвращения множественных включений одного и того же файла заголовка. | Обнаруживает любое использование, которое не соответствует правилу AV 27. Предполагая, что 35/27 не нарушено, сообщает только #ifndef. |
| 29 | #define директива препроцессора не должна использоваться для создания встроенных макросов. Вместо него должны использоваться встроенные функции. | Правило разделено на две части: определение макрофункции (29.def) и вызов макрофункции (29.use). Сообщения в файле отчета:
|
| 30 | #define директива препроцессора не должна использоваться для определения постоянных значений. Вместо этого, const квалификатор применяется к объявлениям переменных для указания значений констант. | Отчеты #define простых констант. |
| 31 | #define директива препроцессора будет использоваться только как часть техники для предотвращения множественных включений одного и того же файла заголовка. | Обнаруживает использование #define которые не используются для защиты от множественного включения при условии, что правила 35 и 27 не нарушаются. |
| 32 | #include директива препроцессора будет использоваться только для включения файлов заголовков (* .h). |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 33 | #include директива должна использовать <filename.h> для включения файлов заголовков. | |
| 35 | Файл заголовка будет содержать механизм, который предотвращает множественные включения самого себя. | |
| 39 | Заголовочные файлы (*.h) не будет содержать определения переменных, отличных от const, или определения функций. | Сообщает определения глобальных переменных/функций в заголовке. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 40 | Каждый файл реализации должен содержать заголовочные файлы, которые однозначно определяют встроенные функции, типы и используемые шаблоны. | Сообщает, когда тип, шаблон или встроенная функция определены в исходном файле. Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. |
| 41 | Длина исходных строк не должна превышать 120 символов. | |
| 42 | Каждое выражение-оператор будет находиться в отдельной строке. | Сообщает, когда две последовательные инструкции выражения находятся в одной строке (если только инструкции не являются частью определения макроса). |
| 43 | Следует избегать вкладок. | |
| 44 | Все отступы будут состоять, по крайней мере, из двух пробелов и совпадать в одном исходном файле. | «Сообщает, когда отступы инструкции не превышают двух пробелов, содержащих ее». Не сообщает о плохом отступе между открывающими фигурными скобками, следующими за инструкциями if/else, do/while, for и while. NB: в окончательном выпуске он примет любые отступы |
| 46 | Указанные пользователем идентификаторы (внутренние и внешние) не будут зависеть от значимости более 64 символов. | Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access). |
| 47 | Идентификаторы не будут начинаться с символа подчеркивания_'. | |
| 48 | Идентификаторы не будут отличаться:
| Проверяется независимо от области действия. Не проверено между макросами и другими идентификаторами. Сообщения в файле отчета:
|
| 50 | Первое слово имени класса, структуры, пространства имен, перечисления или типа, созданного с помощью | Сообщения в файле отчета:
Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. |
| 51 | Все буквы, содержащиеся в именах функций и переменных, будут полностью состоять из строчных букв. | Сообщения в файле отчета:
|
| 52 | Идентификаторы констант и значений перечислителя должны быть строчными. | Сообщения в файле отчета:
|
| 53 | Заголовочные файлы всегда будут иметь расширение имени файла ".h". |
|
| 53.1 | Следующие последовательности символов не должны отображаться в именах заголовочных файлов: ', \, /*, //, или ". | |
| 54 | Файлы реализации всегда будут иметь расширение имени файла. «cpp». | Не чувствителен к регистру, если установлен параметр -dos. |
| 57 | В этом порядке будут объявлены открытые, защищенные и частные секции класса. | |
| 58 | При объявлении и определении функций с более чем двумя параметрами ведущая скобка и первый аргумент будут записаны в одной строке с именем функции. Каждый дополнительный аргумент будет записан в отдельной строке (с закрывающей скобкой непосредственно после последнего аргумента). | Определяет, что два параметра не находятся в одной строке. Первый параметр должен находиться в одной строке с именем функции. Не проверяет закрывающую скобку. |
| 59 | Утверждения, образующие тело если, иначе если, иначе, пока, делать... пока или для утверждения всегда должны быть заключены в фигурные скобки, даже если фигурные скобки образуют пустой блок. | Сообщения в файле отчета:
|
| 60 | Брекеты ("{}"), которые включают блок, будут помещены в тот же столбец на отдельных строках непосредственно перед и после блока. | Определяет, что фигурные скобки блоков инструкций должны находиться в одних и тех же столбцах. |
| 61 | Брекеты ("{}"), которые включают блок, не будут иметь ничего другого в строке, кроме комментариев. | |
| 62 | Оператор отмены ссылки «*» и оператор адреса «&» будут непосредственно связаны со спецификатором типа. | Сообщает о наличии пробела между типом и «*» «&» для переменных, параметров и объявления полей. |
| 63 | Пробелы не будут использоваться вокруг. «» или «- >», а также между унарными операторами и операндами. | Сообщает, когда следующие символы не связаны непосредственно с пробелом:
Обратите внимание, что о нарушении будет сообщено для «»., используемого в определении float/double. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 67 | Общедоступные и защищенные данные должны использоваться только в структурах, а не в классах. | |
| 68 | Ненужные неявно созданные функции-члены должны быть явно запрещены. | Сообщает, когда конструктор по умолчанию, оператор назначения, конструктор копирования или деструктор не объявлены. |
| 71.1 | Виртуальные функции класса не должны вызываться из деструктора или любого из его конструкторов. | Сообщает, когда конструктор или деструктор непосредственно вызывает виртуальную функцию. |
| 74 | Инициализация нестатических членов класса будет выполняться через список инициализации элементов, а не через назначение в теле конструктора. | Все данные должны быть инициализированы в списке инициализации, кроме массива. Не сообщает о наличии назначения в Сообщение в файле отчета: Инициализация нестатических членов класса " |
| 75 | Члены списка инициализации должны быть перечислены в том порядке, в котором они объявлены в классе. | |
| 76 | Конструктор копирования и оператор назначения должны быть объявлены для классов, содержащих указатели на элементы данных или нетривиальные деструкторы. | Сообщения в файле отчета:
Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. |
| 77.1 | Определение функции-члена не должно содержать аргументов по умолчанию, создающих подпись, идентичную сигнатуре неявно объявленного конструктора копирования для соответствующего класса/структуры. | Не сообщает о наличии конструктора явной копии. |
| 78 | Все базовые классы с виртуальной функцией должны определять виртуальный деструктор. | |
| 79 | Все ресурсы, полученные классом, освобождаются деструктором класса. | Сообщает, когда число «new», вызываемое в конструкторе, превышает число «delete», вызываемое в деструкторе.
Примечание Нарушение возникает, даже если «новое» сделано в «если/иначе».
|
| 81 | Оператор назначения должен правильно выполнять самостоятельное назначение | Сообщает, когда тело назначения копирования не начинается с " Нарушение не возникает, если оно пусто Нарушение возникает, когда |
| 82 | Оператор назначения возвращает ссылку на *this. | Следующие операторы должны вернуться
Не сообщает об отсутствии возврата. Нет специального сообщения, если тип не соответствует. Сообщения в файле отчета:
|
| 83 | Оператор назначения назначает все элементы данных и базы данных, которые влияют на инвариант класса (элемент данных, представляющий кэш, например, не требуется копировать). | Отчеты о том, что при присвоении копии не назначаются все элементы данных. В производном классе он также сообщает, когда назначение копирования не вызывает наследованные назначения копирования. |
| 88 | Множественное наследование допускается только в следующей ограниченной форме: n интерфейсы плюс m частные реализации плюс максимум одна защищенная реализация. | Сообщения в файле отчета:
|
| 88.1 | Виртуальная база с состоянием должна быть явно объявлена в каждом производном классе, который обращается к ней. | |
| 89 | Базовый класс не должен быть как виртуальным, так и невиртуальным в одной иерархии. | |
| 94 | Унаследованная невиртуальная функция не должна быть переопределена в производном классе. | Не сообщает для деструктора. Сообщение в файле отчета: Унаследованная невиртуальная функция |
| 95 | Унаследованный параметр по умолчанию никогда не будет переопределен. | |
| 96 | Массивы не должны обрабатываться полиморфно. | Сообщает об арифметическом и аналогичном массиву доступе к выражениям, тип указания которых используется в качестве базового класса. |
| 97 | Массивы не должны использоваться в интерфейсе. | Только для предотвращения затухания массива в указатель. Не проверено в частных методах |
| 97.1 | Ни один из операндов оператора равенства (== или !=) должен быть указателем на функцию виртуального члена. | Отчеты == и != по указателю на функцию-член полиморфных классов (не может определить статически, является он виртуальным или нет), за исключением случая, когда один аргумент является константой null. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 98 | Каждое нелокальное имя, кроме main(), должно быть помещено в некоторое пространство имен. | Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. |
| 99 | Пространства имен не будут вложены глубиной более двух уровней. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 104 | Перед использованием шаблона должна быть объявлена его специализация. | Сообщает о фактическом сообщении об ошибке компиляции. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 107 | Функции всегда должны быть объявлены в объеме файла. | |
| 108 | Функции с переменным числом аргументов не используются. | |
| 109 | Определение функции не должно помещаться в спецификацию класса, если только функция не должна быть встроена. | Сообщает, когда «inline» отсутствует в определении функции-члена внутри определения класса. |
| 110 | Функции с более чем 7 аргументами не будут использоваться. | |
| 111 | Функция не должна возвращать указатель или ссылку на нестатический локальный объект. | Обнаружены простые случаи без эффекта псевдонима. |
| 113 | Функции будут иметь одну точку выхода. | Отчет о первом возврате, или один раз на функцию. |
| 114 | Все точки выхода функций возврата стоимости должны быть через операторы возврата. | |
| 116 | Небольшие аргументы конкретного типа (размером два или три слова) должны передаваться по значению, если изменения формальных параметров не должны отражаться в вызывающей функции. | Сообщать ссылки на постоянные параметры с помощью sizeof <= 2 * sizeof(int). Не сообщает для конструктора копий. |
| 117 | Аргументы должны передаваться по ссылке, если значения NULL невозможны:
| Средство проверки помечает параметр, переданный указателем, если параметр не сравнивается с Средство проверки не вызывает нарушения:
|
| 119 | Функции не должны вызывать себя прямо или косвенно (т.е. рекурсия не допускается). | Средство проверки сообщает о каждой функции, вызывающей себя, прямо или косвенно. Даже если в одном цикле рекурсии задействовано несколько функций, каждая функция сообщается отдельно. Можно вычислить общее количество циклов рекурсии с помощью метрики сложности кода. |
| 121 | Кандидатами для встроенных функций должны считаться только функции с 1 или 2 инструкциями. | Сообщает о встроенных функциях с более чем 2 инструкциями. |
| 122 | Тривиальные функции доступа и мутатора должны быть встроены. | Средство проверки использует следующие критерии, чтобы определить, является ли метод тривиальным:
Средство проверки сообщает о тривиальных методах доступа и мутатора, определенных вне их классов без Средство проверки не помечает методы шаблонов или виртуальные методы. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 126 | Только допустимые комментарии стиля C++ (//) должны использоваться. | |
| 127 | Код, который не используется (комментируется), должен быть удален. | Средство проверки использует внутреннюю эвристику для обнаружения комментированного кода. Например, такие символы, как Средство проверки не помечает следующие комментарии, даже если они содержат код:
Контролер считает, что эти замечания предназначены для целей документирования или введены намеренно с некоторой предубежденностью. |
| 133 | Каждый исходный файл документируется вводным комментарием, в котором содержится информация об имени файла, его содержимом и любой необходимой программе информацией (например, юридическими утверждениями, информацией об авторских правах и т.д.). | Сообщает, когда файл не начинается с двух строк комментария. Примечание.Это правило не может быть аннотировано в исходном коде. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 135 | Идентификаторы во внутренней области не должны использовать то же имя, что и идентификатор во внешней области, и, следовательно, скрывать этот идентификатор. | Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. |
| 136 | Заявления должны иметь наименьший возможный охват. | Сообщает, когда:
Примечание
|
| 137 | По возможности все объявления в области файла должны быть статическими. | Начиная с R2021a, эта проверка создается в объявлениях нестатических объектов, используемых только в одном файле. Проверка выполняется даже при анализе одиночного файла. Средство проверки не создается в объявлениях объектов, которые остаются неиспользуемыми, например:
Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access). |
| 138 | Идентификаторы не должны одновременно иметь как внутреннюю, так и внешнюю связь в одном и том же блоке перевода. | |
| 139 | Внешние объекты не будут объявлены в нескольких файлах. | Сообщает обо всех повторяющихся объявлениях в блоке перевода. Сообщает, когда локализация объявления не одинакова во всех единицах перевода. Эта проверка деактивируется в анализе Polyspace as You Code по умолчанию. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access). |
| 140 | Спецификатор класса хранения регистров не используется. | |
| 141 | Класс, структура или перечисление не будут объявлены в определении его типа. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 142 | Перед использованием все переменные должны быть инициализированы. | Выполняется с помощью неинициализированных проверок переменных в программном обеспечении. |
| 144 | Фигурные скобки должны использоваться для указания и согласования структуры при ненулевой инициализации массивов и структур. | Это относится к частичной инициализации. |
| 145 | В списке перечислителей '=Конструкция 'не должна использоваться для явной инициализации элементов, отличных от первого, если только все элементы не инициализированы явным образом. | Создает один отчет для списка перечислителей. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 147 | Базовые битовые представления чисел с плавающей запятой не должны использоваться программистом каким-либо образом. | Отчеты о слепках с поплавковыми указателями (кроме с void*). |
| 148 | Типы перечисления должны использоваться вместо целочисленных типов (и констант) для выбора из ограниченного ряда вариантов. | Отчеты о том, что в коммутаторах используются типы, не относящиеся к перечислению. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 149 | Восьмеричные константы (отличные от нуля) не используются. | |
| 150 | Шестнадцатеричные константы будут представлены с использованием всех прописных букв. | |
| 151 | Числовые значения в коде не будут использоваться; вместо этого будут использоваться символьные значения. | Сообщает о прямых числовых константах (за исключением целочисленного/плавающего значения Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. |
| 151.1 | Строковый литерал не должен изменяться. | Средство проверки правил помечает назначение строковых литералов:
|
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 152 | Многократное объявление переменных не допускается в одной строке. | Сообщает, когда две последовательные инструкции объявления находятся в одной строке (если только инструкции не являются частью определения макроса). |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 153 | Профсоюзы не используются. | |
| 154 | Битовые поля должны иметь только явно неподписанные интегральные или перечислимые типы. | |
| 156 | Все члены структуры (или класса) должны быть названы и доступны только через их имена. | Сообщает неименованные битовые поля (неименованные поля не допускаются). |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 157 | Операнд правой руки && или || оператор не должен содержать побочных эффектов. | Предполагает, что правило 159 не нарушается. Сообщения в файле отчета:
|
| 158 | Операнды логического | Сообщения в файле отчета:
Исключение для: |
| 159 | Операторы | Сообщения в файле отчета:
|
| 160 | Выражение назначения должно использоваться только в качестве выражения в операторе выражения. | Только простое назначение, не +=, ++и т.д. |
| 162 | Подписанные и неподписанные значения не должны смешиваться в арифметических или сравнительных операциях. | |
| 163 | Арифметика без знака не используется. | |
| 164 | Правый операнд оператора сдвига должен лежать между нулем и единицей меньше ширины в битах левого операнда (включительно). | |
| 164.1 | Левый операнд правого оператора не должен иметь отрицательного значения. | Обнаруживает постоянный регистр +. Находится в программном обеспечении для динамических случаев. |
| 165 | Оператор «унарный минус» не применяется к неподписанному выражению. | |
| 166 | sizeof оператор не будет использоваться в выражениях, содержащих побочные эффекты. | |
| 168 | Оператор запятой не используется. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 169 | По возможности следует избегать указателей на указатели. | Сообщает указатели второго уровня, за исключением аргументов основного. |
| 170 | Не допускается использование более 2 уровней косвенности указателя. | Отчеты только по переменным/параметрам. |
| 171 | Реляционные операторы не должны применяться к типам указателей, за исключением случаев, когда оба операнда имеют одинаковый тип и указывают на:
| Отчеты, когда реляционный оператор используется для типов указателей (слепки игнорируются). |
| 173 | Адрес объекта с автоматическим хранением не должен присваиваться объекту, который сохраняется после прекращения существования объекта. | |
| 174 | Ссылка на нулевой указатель не должна быть отменена. | Выполнено с проверками программного обеспечения. |
| 175 | Указатель не должен сравниваться с NULL или быть назначенным NULL; использовать простой 0 вместо этого. | Отчет об использовании NULL макрос в контекстах указателей. |
| 176 | A | Отчеты не -typedef указатели функций или указатели на функции-члены для типов переменных, полей, параметров. Возвращает тип функции, приведение и спецификацию исключения. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 177 | Следует избегать пользовательских функций преобразования. | Сообщает о пользовательской функции преобразования, неявном конструкторе с одним параметром или значением по умолчанию для других (даже неопределенных). Не сообщает о конструкторе копии. Дополнительное сообщение для случая конструктора: Этот конструктор должен быть помечен как «явный». |
| 178 | Отливка вниз (отливка от базового к производному классу) допускается только с помощью одного из следующих механизмов:
| Отчеты с явным понижением, dynamic_cast включены. (Паттер посетителя не имеет особого случая.) |
| 179 | Указатель на виртуальный базовый класс не должен преобразовываться в указатель на производный класс. | Сообщает об этом конкретном приведении вниз. Разрешает dynamic_cast. |
| 180 | Неявные преобразования, которые могут привести к потере информации, не используются. | Сообщает о следующих неявных слепках:
Не сообщает о приведении в Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. |
| 181 | Избыточные явные слепки не будут использоваться. | Отчеты бесполезны: cast T to T. Отливки в эквивалент typedefs также сообщается. |
| 182 | Не допускается использование литья по типу от любого типа к указателям или от указателей. | Не сообщает, когда применяется правило 181. |
| 184 | Числа с плавающей запятой не должны преобразовываться в целые числа, если только такое преобразование не является определенным алгоритмическим требованием или не необходимо для аппаратного интерфейса. | Отчеты float->int преобразования. Не сообщает о неявных. |
| 185 | Слепки в стиле C++ (const_cast, reinterpret_cast, и static_cast) должны использоваться вместо традиционных отливок типа С. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 186 | Не должно быть недостижимого кода. | Выполнено с серыми проверками в программном обеспечении. Средство поиска ошибок и средство проверки кода проверяют это правило кодирования по-разному. Анализ может дать различные результаты. |
| 187 | Все ненулевые операторы могут иметь побочный эффект. | |
| 188 | Метки не будут использоваться, за исключением операторов switch. | |
| 189 | goto заявление не должно использоваться. | |
| 190 | continue заявление не должно использоваться. | |
| 191 | break оператор не должен использоваться (за исключением случаев завершения оператора переключения). | |
| 192 | Все if, else if конструкции будут содержать либо окончательный, либо else пункт или комментарий, указывающий, почему else предложение не является необходимым. | else if должен содержать else пункт. |
| 193 | Все непустые case пункт в операторе коммутатора должен быть прекращен break заявление. | |
| 194 | Все switch операторы, которые не намерены тестировать для каждого значения перечисления, должны содержать окончательный default пункт. | Отчеты только для отсутствующих default. |
| 195 | A switch выражение не будет представлять логическое значение. | |
| 196 | Каждый switch заявление будет иметь как минимум два случая и потенциальный default. | |
| 197 | Переменные с плавающей запятой не должны использоваться в качестве счетчиков циклов. | Предполагает параметр цикла 1. |
| 198 | Выражение инициализации в for цикл не будет выполнять никаких действий, кроме инициализации значения одного for параметр цикла. | Отчеты, если loop параметр не может быть определен. Предполагает, что правило 200 не нарушено. loop variable параметр считается переменной. |
| 199 | Выражение приращения в for цикл не будет выполнять никаких действий, кроме изменения параметра одного цикла на следующее значение для цикла. | Предполагает параметр цикла 1 (правило 198) с типом, отличным от типа класса. Правило 200 не должно нарушаться, чтобы о нем сообщалось. |
| 200 | Пустые выражения инициализации или приращения в for петли не будут использоваться; a while вместо него будет использоваться цикл. | |
| 201 | Числовые переменные, используемые в цикле for для подсчета итераций, не должны изменяться в теле цикла. | Предполагает параметр 1 цикла (правило 198 AV) и отсутствие записи псевдонима. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 202 | Переменные с плавающей запятой не должны проверяться на точное равенство или неравенство. | Сообщает только о прямом равенстве/неравенстве. Проверка выполнена для всех выражений. |
| 203 | Оценка выражений не должна приводить к переполнению/недоливу. | Выполняется с проверками переполнения в программном обеспечении. |
| 204 | Одна операция с побочными эффектами должна использоваться только в следующих контекстах:
| Сообщает, когда:
|
| 204.1 | Значение выражения должно быть одинаковым при любом порядке оценки, разрешенном стандартом. | Сообщает, когда:
Примечание Операции чтения-записи, такие как++, рассматриваются только как операции записи. |
| 205 | Ключевое слово volatile не должно использоваться, кроме случаев прямого взаимодействия с аппаратными средствами. | Сообщает, используется ли ключевое слово volatile. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 206 | Распределение/освобождение из/в свободное хранилище (кучу) не должно происходить после инициализации. | Сообщает о вызовах функций библиотеки C: malloc / calloc / realloc / free и все new/delete операторов в функциях или методах. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 208 | Исключения C++ не используются. | Отчеты try, catch, throw spec, и throw. |
| N. | Определение JSF++ | Внедрение Polyspace |
|---|---|---|
| 209 | Основные типы | Позволяет использовать только базовые типы посредством прямого typedefs. |
| 213 | В выражениях не должно быть никакой зависимости от правил приоритета операторов C++, ниже арифметических операторов. | Сообщает, когда двоичная операция имеет один операнд, который не заключен в скобки и является операцией с более низким уровнем приоритета. Сообщает побитовые и сдвигает операторы, которые используются без скобок и двоичных аргументов операции. |
| 215 | Арифметика указателя не будет использоваться. | Отчеты: Позволяет |
| N. | Определение JSF++ |
|---|---|
| 2 | Не должно быть никакого самодифицируемого кода. |
| N. | Определение JSF++ |
|---|---|
| 4 | Чтобы нарушить правило «должен», разработчик должен получить следующее одобрение:
|
| 5 | Для нарушения правила волеизъявления или волеизъявления разработчик должен получить следующие разрешения:
|
| 6 | Каждое отклонение от правила «shall» документируется в файле, содержащем отклонение. Отклонения от этого правила не допускаются, несмотря на правило 5 ПЗ. |
| 7 | Официальное утверждение не требуется для отклонения от правила «должен» или «будет», которое соответствует исключению, указанному в этом правиле. |
| N. | Определение JSF++ |
|---|---|
| 10 | Значения типов символов будут ограничены определенным и документированным подмножеством ISO 10646 1. |
| N. | Определение JSF++ |
|---|---|
| 16 | С кодом безопасности (т.е. SEAL 1) должны использоваться только библиотеки DO-178B уровня A [15] или SEAL 1 C/C + +. |
| N. | Определение JSF++ |
|---|---|
| 34 | Заголовочные файлы должны содержать только логически связанные объявления. |
| 36 | Зависимости компиляции должны быть минимизированы, когда это возможно. |
| 37 | Файлы заголовка (include) должны включать только те файлы заголовка, которые необходимы для успешной компиляции. Файлы, используемые только связанным файлом .cpp, должны помещаться в файл .cpp, а не в файл .h. |
| 38 | Объявления классов, доступ к которым осуществляется только через указатели (*) или ссылки (&), должны предоставляться заголовками пересылки, содержащими только объявления пересылки. |
| N. | Определение JSF++ |
|---|---|
| 45 | Все слова в идентификаторе будут разделены символом «_». |
| 49 | Все акронимы в идентификаторе будут состоять из прописных букв. |
| 55 | Имя файла заголовка должно отражать логическую сущность, для которой оно предоставляет объявления. |
| 56 | Имя файла реализации должно отражать логическую сущность, для которой оно предоставляет определения, и иметь расширение. «cpp» (это имя обычно идентично заголовочному файлу, который предоставляет соответствующие объявления). Иногда требуется более одного файла .cpp для данной логической сущности. В этих случаях следует добавить суффикс, отражающий логическое различие. |
| N. | Определение JSF++ |
|---|---|
| 64 | Интерфейс класса должен быть полным и минимальным. |
| 65 | Структура должна использоваться для моделирования сущности, для которой не требуется инвариант. |
| 66 | Класс должен использоваться для моделирования сущности, которая поддерживает инвариант. |
| 69 | Функция-член, которая не влияет на состояние объекта (его переменные экземпляра), будет объявлена константной. Функции-члены по умолчанию должны быть const. Только при наличии четкой, явной причины модификатор const в функциях-членах должен быть опущен. |
| 70 | Класс будет иметь друзей только тогда, когда функция или объект требует доступа к частным элементам класса, но не может быть членом класса по причинам логики или эффективности. |
| 70.1 | Объект не должен использоваться ненадлежащим образом до начала срока его службы или после его окончания. |
| 71 | Вызовы внешне видимой операции объекта, кроме его конструкторов, не должны разрешаться до полной инициализации объекта. |
| 72 | Инвариант для класса должен быть:
|
| 73 | Не должны быть определены ненужные конструкторы по умолчанию. |
| 77 | Конструктор копирования копирует все элементы данных и базы, которые влияют на инвариант класса (элемент данных, представляющий кэш, например, не требуется копировать). |
| 80 | Операторы копирования и назначения по умолчанию будут использоваться для классов, когда эти операторы предлагают разумную семантику. |
| 84 | Перегрузка оператора будет использоваться скудно и обычным образом. |
| 85 | Когда два оператора противоположны (например, = и! =), оба будут определены, а один будет определен в терминах другого. |
| 86 | Конкретные типы должны использоваться для представления простых независимых концепций. |
| 87 | Иерархии должны основываться на абстрактных классах. |
| 90 | Широко используемые интерфейсы должны быть минимальными, общими и абстрактными. |
| 91 | Общедоступное наследование будет использоваться для реализации отношений «is-a». |
| 92 | Подтип (публично производные классы) будет соответствовать следующим рекомендациям в отношении всех классов, участвующих в полиморфном присвоении различных экземпляров подкласса одной и той же переменной или параметру во время выполнения системы:
Другими словами, методы подкласса должны ожидать меньше и доставлять больше, чем методы базового класса, которые они переопределяют. Это правило подразумевает, что подтипы будут соответствовать принципу подстановки Лискова. |
| 93 | «has-a» или «is-implemented-in-te-of» отношения будут смоделированы через членство или непубличное наследование. |
| N. | Определение JSF++ |
|---|---|
| 100 | Элементы из пространства имен должны выбираться следующим образом:
|
| N. | Определение JSF++ |
|---|---|
| 101 | Шаблоны должны быть рассмотрены следующим образом:
|
| 102 | Тесты шаблона должны быть созданы для охвата всех фактических экземпляров шаблона. |
| 103 | Проверки ограничений должны применяться к аргументам шаблона. |
| 105 | Зависимость определения шаблона от контекстов создания экземпляров должна быть сведена к минимуму. |
| 106 | При необходимости следует проводить специализации для типов указателей. |
| N. | Определение JSF++ |
|---|---|
| 112 | Возвращаемые функции значения не должны скрывать владение ресурсами. |
| 115 | Если функция возвращает информацию об ошибке, то эта информация об ошибке будет проверена. |
| 118 | Аргументы должны передаваться через указатели, если возможны значения NULL:
|
| 120 | Перегруженные операции или методы должны образовывать семейства, которые используют одну и ту же семантику, имеют одно и то же имя, имеют одинаковую цель и отличаются формальными параметрами. |
| 123 | Количество функций доступа и мутатора должно быть сведено к минимуму. |
| 124 | Тривиальные функции переадресации должны быть встроены. |
| 125 | Следует избегать ненужных временных объектов. |
| N. | Определение JSF++ |
|---|---|
| 128 | Комментарии, которые документируют действия или источники (например, таблицы, рисунки, параграфы и т.д.) за пределами документируемого файла, не будут разрешены. |
| 129 | Комментарии в файлах заголовков должны описывать внешне видимое поведение документируемых функций или классов. |
| 130 | Назначение каждой строки исполняемого кода должно объясняться комментарием, хотя один комментарий может описывать несколько строк кода. |
| 131 | Следует избегать указания в комментариях того, что лучше указать в коде (т.е. не просто повторить то, что есть в коде). |
| 132 | Каждое объявление переменной, typedef, значение перечисления и элемент структуры будут прокомментированы. |
| 134 | Допущения (ограничения), сделанные функциями, должны быть задокументированы в преамбуле функции. |
| N. | Определение JSF++ |
|---|---|
| 143 | Переменные не будут введены, пока не будут инициализированы значимыми значениями. (См. также AV-правило 136, AV-правило 142 и AV-правило 73, касающиеся области объявления, инициализации перед использованием и конструкторов по умолчанию соответственно.) |
| N. | Определение JSF++ |
|---|---|
| 146 | Реализации с плавающей запятой должны соответствовать определенному стандарту с плавающей запятой. Используется стандарт ANSI ®/IEEE ® Std 754 [1]. |
| N. | Определение JSF++ |
|---|---|
| 155 | Битовые поля не будут использоваться для упаковки данных в слово с единственной целью экономии места. |
| N. | Определение JSF++ |
|---|---|
| 167 | Реализация целочисленного деления в выбранном компиляторе определяется, документируется и учитывается. |
| N. | Определение JSF++ |
|---|---|
| 183 | Следует принять все возможные меры, чтобы избежать литья по типу. |
| N. | Определение JSF++ |
|---|---|
| 204 | Одна операция с побочными эффектами должна использоваться только в следующих контекстах:
|
| N. | Определение JSF++ |
|---|---|
| 207 | Можно избежать неинкапсулированных глобальных данных. |
| N. | Определение JSF++ |
|---|---|
| 210 | Алгоритмы не должны делать допущений относительно того, как данные представлены в памяти (например, big endian vs. little endian, порядок подобъектов базового класса в производных классах, нестатический порядок членов данных по спецификаторам доступа и т.д.). |
| 210.1 | Алгоритмы не должны делать допущений относительно порядка распределения нестатических элементов данных, разделенных спецификатором доступа. |
| 211 | Алгоритмы не должны предполагать, что по конкретным адресам начинаются шорты, вкрапления, наплавки, двойки или длинные двойки. |
| 212 | Функционирование при неполном потоке или переполнении не должно зависеть каким-либо особым образом. |
| 214 | Предполагая, что нелокальные статические объекты, в отдельных единицах перевода, инициализируются в особом порядке, делать не следует. |
| N. | Определение JSF++ |
|---|---|
| 216 | Программисты не должны пытаться преждевременно оптимизировать код. |
| N. | Определение JSF++ |
|---|---|
| 217 | Ошибки времени компиляции и времени связи должны быть предпочтительнее ошибок времени выполнения. |
| 218 | Уровни предупреждения компилятора будут установлены в соответствии с политикой проекта. |
| N. | Определение JSF++ |
|---|---|
| 219 | Все тесты, применяемые к интерфейсу базового класса, также должны применяться ко всем производным интерфейсам класса. Если производный класс представляет более сильные постусловия/инварианты, то новые постусловия/инварианты заменяются в производных классовых тестах. |
| 220 | Алгоритмы структурного покрытия должны применяться против сплющенных классов. |
| 221 | Структурное покрытие класса в иерархии наследования, содержащей виртуальные функции, должно включать в себя проверку каждого возможного разрешения для каждого набора идентичных полиморфных ссылок. |