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)
重点是什么?谢谢.
MISRA-C:2004 规则 10.1(引用的指南)规定:
在以下情况下,整数类型表达式的值不应隐式转换为不同的基础类型:
- 它不是转换为具有相同符号的更广泛的整数类型,或者
- ...
在引用的示例中,转换为更宽的整数类型(int8_t 到 int16_t),因此规则 10.1 不适用。
扩展(10.1 和 10.2)解释了该规则的目的是防止从更宽的类型到更窄的类型的隐式转换。反之则没有任何限制!
-- 编辑添加 --
作为更新,MISRA-C:2004 规则 10.1 分布在 MISRA C:2012 中的多个规则中...映射表(附录 1)包括注释:
放宽限制以允许对函数参数或返回值进行隐式扩展转换。
因此,对于 MISRA C:2012,这不再是违规行为。如果偏离 2004 年规则(恕我直言,这是正确的方法),您可能希望考虑这一点。