Почему MISRA-C не позволяет неявно расширять тип в некоторых обстоятельствах? - PullRequest
0 голосов
/ 18 октября 2018

Неявное расширение типа аргумента функции или возвращаемого выражения запрещено MISRA-C: правило 2004 10.1 , как показано в следующем кодефрагмент:

void foo1(int16_t x);

int16_t foo2(void) 
{
    int8_t s8a;
    ...
    foo1(s8a);                               /* not compliant */
    ...
    return s8a;                              /* not compliant */
}

Но, насколько я понимаю, они ничем не отличаются от ситуации назначения:

s16a = s8a;                                  /* compliant     */

Какой смысл?Спасибо.

1 Ответ

0 голосов
/ 30 октября 2018

MISRA-C: Правило 10.1 2004 года (цитируемое Руководство) гласит:

Значение выражения целочисленного типа не должно быть неявно преобразовано в другой базовый тип, если:

  1. это не преобразование в более широкий целочисленный тип с той же самой подписью или
  2. ...

В приведенном примере преобразование равно для более широкого целочисленного типа (от int8_t до int16_t), поэтому правило 10.1 не применяется.

Расширение (из 10.1 и 10.2) объясняет, что целью правила является предотвращение неявных преобразований изшире к узким типам.Никаких ограничений нет!

Ваш инструмент сломан.

...