CERT C: Rec. EXP11-C

Не делайте предположения относительно размещения структур с битовыми полями

Описание

Управляйте определением

Не делайте предположения относительно размещения структур с битовыми полями. [1]

Примеры

развернуть все

Описание

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

Анализ обнаруживает следующие возможности заданного реализацией поведения в C99 и их дубликатов в C90. Если вы знаете поведение своей реализации компилятора, выравниваете по ширине результат анализа с соответствующими комментариями. Чтобы выровнять по ширине результат, присвойте одно из этих состояний: Justified, No action planned или Not a defect.

Совет

К массе - выравнивают по ширине все результаты, которые показывают на то же заданное реализацией поведение, используют столбец Detail на панели Results List. Кликните по заголовку столбца так, чтобы все результаты с той же записью группировались. Выберите первый результат и затем выберите последний результат при удержании клавиши Shift. Присвойте состояние одному из результатов. Если вы не видите столбец Detail, щелкните правой кнопкой по любому другому заголовку столбца и включите этот столбец.

Приложение стандарта C99 касательноПоведение, которое будет зарегистрированоКак Polyspace® Helps
J.3.2: СредаАльтернативный способ, которым может быть задана функция main.

Анализ отмечает main с помощью аргументов, и возвратите типы кроме:

int main(void) { ... }
или
int main(int argc, char *argv[]) { ... }

Смотрите раздел 5.1.2.2.1 из Стандарта C99.

J.3.2: СредаНабор имен среды и метода для изменения списка сред используется функцией getenv.

Анализ отмечает использование функции getenv. Для этой функции необходимо знать список переменных окружения и как список изменяется.

Смотрите раздел 7.20.4.5 из Стандарта C99.

J.3.6: плавающая точкаОкругляющиеся поведения охарактеризованы нестандартными значениями FLT_ROUNDS.

Анализ отмечает включать float.h, если значения FLT_ROUNDS вне набора, {-1, 0, 1, 2, 3}. Только значения в этом наборе приводят к четко определенному поведению округления.

Смотрите раздел 5.2.4.2.2 из Стандарта C99.

J.3.6: плавающая точкаМетоды оценки охарактеризованы нестандартными отрицательными величинами FLT_EVAL_METHOD.

Анализ отмечает включать float.h, если значения FLT_EVAL_METHOD вне набора, {-1, 0, 1, 2}. Только значения в этом наборе приводят к четко определенному поведению для операций с плавающей точкой.

Смотрите раздел 5.2.4.2.2 из Стандарта C99.

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

Анализ отмечает преобразования от целого числа до типов данных с плавающей точкой меньшего размера (например, 64-битный int к 32-битному float).

Смотрите раздел 6.3.1.4 из Стандарта C99.

J.3.6: плавающая точкаНаправление округления, когда число с плавающей запятой преобразовано в более узкое число с плавающей запятой.

Анализ отмечает эти преобразования:

  • double к float

  • long double к double или float

Смотрите раздел 6.3.1.5 из Стандарта C99.

J.3.6: плавающая точкаСостояние по умолчанию для прагмы FENV_ACCESS.

Анализ отмечает использование прагмы кроме:

#pragma STDC FENV_ACCESS ON
или
#pragma STDC FENV_ACCESS OFF

Смотрите раздел 7.6.1 из Стандарта C99.

J.3.6: плавающая точкаСостояние по умолчанию для прагмы FP_CONTRACT.

Анализ отмечает использование прагмы кроме:

#pragma STDC FP_CONTRACT ON
или
#pragma STDC FP_CONTRACT OFF

Смотрите раздел 7.12.2 из Стандарта C99.

J.3.11: предварительная обработка директивПоведение на каждом распознало non-STDC #pragma директива.

Анализ отмечает использование прагмы:

#pragma pp-tokens
где обрабатывающий маркерный STDC сразу не делает followpragma. Например:
#pragma FENV_ACCESS ON

Смотрите раздел 6.10.6 из Стандарта C99.

J.3.12: Библиотечные функцииПовышает ли функция feraiseexcept ''неточное'' исключение с плавающей точкой в дополнение к ''переполнению'', или ''недостаточно заполните'' исключение с плавающей точкой.

Анализ отмечает вызовы функции feraiseexcept.

Смотрите раздел 7.6.2.3 из Стандарта C99.

J.3.12: Библиотечные функцииСтроки кроме "C" и "", который может быть передан в качестве второго аргумента функции setlocale.

Анализ отмечает вызовы функции setlocale, когда ее вторым аргументом не является "C" или "".

Смотрите раздел 7.11.1.1 из Стандарта C99.

J.3.12: Библиотечные функцииТипы задали для float_t и double_t, когда значение макроса FLT_EVAL_METHOD - меньше чем 0 или больше, чем 2.

Анализ отмечает включать math.h, если FLT_EVAL_METHOD имеет значения вне набора {0,1,2}.

Смотрите раздел 7.12 из Стандарта C99.

J.3.12: Библиотечные функцииОснова 2 логарифма модуля, используемого the remquo, функционирует в сокращении частного.

Анализ отмечает вызовы remquo, remquof и функции remquol.

Смотрите раздел 7.12.10.3 из Стандарта C99.

J.3.12: Библиотечные функцииСостояние завершения, возвращенное в серверную среду abort, exit или функцией _Exit.

Анализ отмечает вызовы abort, exit или функции _Exit.

Смотрите разделы 7.20.4.1, 7.20.4.3 или 7.20.4.4 из Стандарта C99.

Риск

Построение кода задало реализацией поведение, если стандарт C позволяет компиляторам выбирать свои собственные спецификации для построения. Полный список заданного реализацией поведения доступен в Приложении J.3 стандартного ISO/IEC 9899:1999 (C99) и в Приложении G.3 стандартного ISO/IEC 9899:1990 (C90).

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

Проверяйте информацию

Группа: Rec. 03. Выражения (EXP)

Введенный в R2019a


[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.