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

为什么MISRA-C在某些情况下不允许隐式扩展类型?,c,type-conversion,misra,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 complia

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     */
重点是什么?谢谢。

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

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

  • 它不是到具有相同符号的更宽整数类型的转换,或
  • 在引用的示例中,转换为更宽的整数类型(int8到int16),因此规则10.1不适用

    扩展(10.1和10.2)解释了规则的目的是防止从更宽类型到更窄类型的隐式转换。另一方面没有限制


    您的工具已损坏。

    Rust也有类似的限制,您需要显式转换(例如,将a:u16=3u8设为u16)。关于这件事有很多讨论,例如。我没有完整地阅读这篇文章,但总结是,您不会无意中将不同的类型添加到一起,例如u16和u8,因为结果可能会令人惊讶。我猜这是Misra-C:2004规则10.1
    整数类型的表达式的值不应隐式转换为不同的基础类型,如果:[……]表达式不是常量,是函数参数[…]
    。但是下面写的是,他们的意思是不允许从更宽的类型转换为更窄的类型,没有什么是相反的。你能举出你指的是哪个MISRA C规则吗,@dingcure?@Andrew正如Kamil Cuk指出的,这是MISRA-C:2004规则10.1。但是OP的例子取自规则10.1(虽然有一次复制错误)。我的回答与您相同,但问题是“d)表达式不是常量,而是返回表达式”。为什么MISRA-C:2004有这个奇怪的规则,我无法回答——因为它毫无意义。传递的返回值和参数是左值转换。将左值转换为具有相同符号性的更宽整数类型是完全安全的。MISRA-C:2012幸运的是没有这个奇怪的规则。我不知道委员会在2004年是怎么想的,关于10.1 c)和d),也就是说,文本“不符合”不是来自损坏的工具,而是来自下面的例子MISRA-c:2004规则10.1。