MISRA C:2012 Rule 1.3

Не должно быть никакого вхождения неопределенного или критического незаданного поведения

Описание

Примечание

Используйте Bug Finder вместо Code Prover для проверки правил кодирования. Поддержка кодирования правил, регистрируясь в Code Prover будет удалена в будущем релизе. См. Вопросы совместимости.

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

Не должно быть никакого вхождения неопределенного или критического незаданного поведения.

Объяснение

Код С, который приводит к неопределенному или критическому незаданному поведению, может привести к неожиданным или неправильным результатам. Такой код может вести себя по-другому в различных реализациях. Проблемы, вызванные неопределенным поведением в коде, могут затруднить, чтобы анализировать, потому что компиляторы могут оптимизировать код, принимающий, что неопределенное поведение не происходит.

Много правил MISRA C:2012 обращаются к определенным неопределенным или критическим незаданным поведениям. Это правило применяется к любому неопределенному или критическому незаданному поведению, которое не обращено ни в каком другом правиле.

Реализация Polyspace

Polyspace® флаги эти экземпляры неопределенного или критического неопределенного поведения:

  • Использование offsetof на битовых полях.

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

  • Использование defined без идентификатора.

  • Использование массива неполных типов.

  • Использование функции как макросы при помощи неправильного количества аргументов.

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

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

#include <stddef.h>     /* offsetof */

struct str {
  char a:8;
  char b[10];
  char c;
};
void foo() {
  
  offsetof(struct str, a);//Noncompliant
  offsetof(struct str, d);//Noncompliant
}

В этом примере, функциональном foo использует макро-offsetof на битовом поле str.a. Это поведение не определено. Polyspace отмечает его. Функция затем вызывает offsetof на str.d. Поскольку d не поле str, Polyspace отмечает его. Эти проблемы могут вызвать ошибки компиляции.

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

Группа: стандарт C среда
Категория: необходимый
Категория AGC: необходимый

Вопросы совместимости

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

Не рекомендуемый запуск в R2021b

Введенный в R2014b