Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top

Вебинар: Стратегия без иллюзий: как превращать цели в результаты - 19.08

menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V2593. MISRA. Single-bit bit fields should not be declared as signed type.

30 Июл 2026

Диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

Однобитные битовые поля не стоит объявлять со знаковым типом. Согласно стандарту C99 §6.2.6.2, однобитное битовое поле знакового типа имеет один бит для знака и ноль — для значений. При любом представлении целых чисел ноль значащих бит не могут специализировать какое-либо значимое число. Несмотря на то, что C90 не имеет такого описания, правило применяется также и для этой версии стандарта.

В языке C++ поведение при присваивании значения 1 в однобитовое знаковое поле определяется имплементацией.

Рассмотрим пример:

struct S
{
  int a : 1;
};

void foo()
{
  struct S s;
  s.a = 1;

  if (s.a > 0)
  {
    DoWork();
  }
}

Несмотря на то, что в битовое поле явно присваивается 1, проверка на то, что оно больше нуля, не сработает. Поскольку в зависимости от реализации компилятора, единица в поле s.a может быть интерпретирована как знаковый бит. При привидении типов для сравнения к типу int получится число -1 (0xFFFFFFFF). В результате функция DoWork не будет выполнена, поскольку условие -1 > 0 ложно. Корректный вариант:

struct S
{
  unsigned a : 1;
};

void foo()
{
  struct S s;
  s.a = 1u;

  if (s.a > 0u)
  {
    DoWork();
  }
}

Исключением являются безымянные битовые поля, поскольку нельзя использовать значение из такого поля:

struct S
{
  int a : 31;
  int : 1;    // ok
};

Диагностическое правило классифицируется как:

  • MISRA-C-2012-Rule-6.2
  • MISRA-C-2023-Rule-6.2
  • MISRA-CPP-2023-Rule-12.2.3

Ты поймал бага за сек!
А мы в коде ловим их за доли секунды. Хочешь проверить?

Попробовать бесплатно