【发布时间】:2015-01-05 11:52:59
【问题描述】:
我似乎不断收到 MISRA-C:2004 规则 10.1 和 10.3 错误,用于以下 sn-p 中的 lShift 分配,并且无法真正看到可以做些什么来满足要求......为什么我仍然出错了?
#define ADC_INTSELxNy_LOG2_NUMBITS_PER_REG 3U
#define ADC_INTSELxNy_NUMBITS_PER_REG 8U
void foo (const bar_e intNumber) {
uint_least8_t lShift = (uint_least8_t)(ADC_INTSELxNy_NUMBITS_PER_REG - (((((uint_least8_t)intNumber) + 1U) & 0x1U) << ADC_INTSELxNy_LOG2_NUMBITS_PER_REG));
//...
}
【问题讨论】:
-
什么是规则 10.1 和 10.3?
-
10.1:整数类型的表达式的值不应隐式转换为不同的基础类型,如果 A)它不是转换为具有相同符号的更广泛的整数类型,或 B)表达式是复杂的,或者 C) 表达式不是常量并且是函数参数,或者 D) 表达式不是常量并且是返回表达式。
-
10.3:整数类型的复杂表达式的值只能转换为更窄且与表达式的基础类型具有相同符号的类型。
-
虽然 10.3 现在似乎已经消失了,尽管我没有改变任何东西......
-
什么是
bar_e?虽然我不清楚“基础类型”在这里应该是什么意思,但 A) 似乎违反了因为uint_least8_t(在大多数系统上)被提升为int。也许将演员表更改为(unsigned)并使用 0xff 进行屏蔽(这似乎是您的意图,而不是使用(unit_least8_t)-1进行屏蔽)就可以了。不过,我对 MISRA 并不熟悉(并且不同意我目前看到的大多数规则)。