c-试图修复MISRA违规规则10.4:无符号32位int和有符号32位整数不匹配


#define INIT_VALUE 1u
typedef unsigned int uint32_t; 
typedef signed int int32_t;
void do_test(uint32_t var1, int32_t var2);
void do_test(uint32_t var1, int32_t var2) 
{  uint32_t m_var = INIT_VALUE;
m_var = (m_var << 1) + (var1 + var2);
}

此代码违反了规则10.4,原因是无符号var1和有符号var2。

我试过将其中一个变量转换为另一个变量。但这不是一种通用的方式。

有办法做到这一点吗?

规则10.4是一个合理的规则,因为它防止了可能导致签名性变化的隐式类型转换。这就是代码中发生的情况,var1 + var2导致var2被静默地提升为无符号类型。这是不好的,因为这个变量一开始就被签名肯定是有原因的。

只需确保在算法中跟踪签名性即可。如果有符号变量的值为负值,那么隐式转换为无符号变量就是一个错误。否则,如果您知道值总是正的,因此有符号性无关紧要,那么只需将有符号变量强制转换为uint32_t

最新更新