PVS-Studio.com logo
>
>
>
V2639. MISRA. Default association shoul…


V2639. MISRA. Default association should appear as either the first or the last association of a generic selection.

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

Это правило актуально только для языка С.

Ассоциация по умолчанию (объявленная с ключевым словом default) в конструкции _Generic (С11) должна располагаться первой или последней в списке ассоциаций. Такая структура упрощает понимание кода другими программистами.

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

#define abs(Y)( _Generic( (Y)        \
              , long     : labs     \
              , default  : abs      \
              , long long: llabs)(Y))

long foo(long x)
{
  return abs(x);   
}

Ассоциация default располагается между двумя другими: int и char. Такой порядок списка ассоциаций усложняет конструкцию _Generic.

Исправленный код:

// First option
#define abs(Y)(_Generic( (Y)        \
              , default  : abs      \
              , long     : labs     \
              , long long: llabs)(Y))

// Second option
#define abs(Y)( _Generic( (Y)      \
              , long     : labs   \
              , long long: llabs  \
              , default  : abs)(Y))

long foo(long x)
{
  return abs(x);   
}

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

  • MISRA-C-23.8