为什么MISRA-C在某些情况下不允许隐式扩大类型?

din*_*rie 5 c type-conversion misra

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 */
}
Run Code Online (Sandbox Code Playgroud)

但是,根据我的理解,它们与分配情况没有什么不同:

s16a = s8a;                                  /* compliant     */
Run Code Online (Sandbox Code Playgroud)

重点是什么?谢谢.

And*_*rew 1

MISRA-C:2004 规则 10.1(引用的指南)规定:

在以下情况下,整数类型表达式的值不应隐式转换为不同的基础类型:

  1. 它不是转换为具有相同符号的更广泛的整数类型,或者
  2. ...

在引用的示例中,转换更宽的整数类型(int8_t 到 int16_t),因此规则 10.1 不适用。

扩展(10.1 和 10.2)解释了该规则的目的是防止从更宽的类型到更窄的类型的隐式转换。反之则没有任何限制!

-- 编辑添加 --

作为更新,MISRA-C:2004 规则 10.1 分布在 MISRA C:2012 中的多个规则中...映射表(附录 1)包括注释:

放宽限制以允许对函数参数或返回值进行隐式扩展转换。

因此,对于 MISRA C:2012,这不再是违规行为。如果偏离 2004 年规则(恕我直言,这是正确的方法),您可能希望考虑这一点。