MISRA C:2012 Rule 1.3

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

Описание

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

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

Объяснение

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

Много правил 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: необходимый
Введенный в R2014b