MISRA C:2012 Dir 1.1

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

Описание

Определение директивы

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

Объяснение

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

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

Реализация Polyspace

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

Совет

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

C99 стандартное приложение RefДокументируемое поведениеКак Polyspace® Помогает
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: Директивы предварительной обработкиПоведение на каждой распознанной директиве, не относящейся к STDC # pragma.

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

#pragma pp-tokens
где лексема обработка STDC не следует сразу pragma. Для образца:
#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 модуля, используемый 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 стандарта.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

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

Группа: Реализация
Категория: Требуемая
Категория AGC: Требуется
Введенный в R2017b