【发布时间】:2019-07-22 14:58:20
【问题描述】:
在混合 C 和 C++ 程序中给出以下定义:
//in a C file.
uint8_t GetSize()
{
return (uint8_t)something;
}
//in the header of the C++ file.
public:
MyClass(){};
private:
uint8_t index_m;
以下两行都给了我一个静态工具(pc-lint)warning 573。
void MyClass::IncrementWithRollOver(void)
{
index_m = (index_m + 1) % GetSize(); // warning 573 : signed-unsigned mix with divide
}
void MyClass::DecrementWithRollOver(void)
{
index_m = (GetSize() - 1 + index_m) % GetSize(); // warning 573 : signed-unsigned mix with divide
}
我尝试了很多投射,但没有一个可以帮助我摆脱这个警告,为什么?
index_m = (index_m + 1U) % GetSize(); // this one works
index_m = (GetSize() - 1U + index_m) % GetSize();// info 834: operator '-' followed by operator '+' could be confusing without parentheses [MISRA 2004 Rule 12.1, advisory]
index_m = (uint8_t)(index_m + (uint8_t)1) % GetSize(); // warning 573 : signed-unsigned mix with divide, and: info 732: loss of sign (assignment) ('int' to 'uint8_t' (aka 'unsigned char')
index_m = (uint8_t)(GetSize() - (uint8_t)1 + index_m) % GetSize(); // warning 573 : signed-unsigned mix with divide, and: info 834: operator '-' followed by operator '+' could be confusing without parentheses [MISRA 2004 Rule 12.1, advisory]
index_m = (uint8_t)(index_m + (uint16_t)1) % GetSize(); // warning 573 : signed-unsigned mix with divide, and: info 732: loss of sign (assignment) ('int' to 'uint8_t' (aka 'unsigned char')
index_m = (uint8_t)(GetSize() - (uint16_t)1 + index_m) % GetSize(); // warning 573 : signed-unsigned mix with divide, and: info 834: operator '-' followed by operator '+' could be confusing without parentheses [MISRA 2004 Rule 12.1, advisory]
... C 多么痛苦!
有什么快速解决方法?
读完cmets我也试过了,没成功
index_m = (uint8_t)(index_m + (uint32_t)1) % GetSize(); // works
index_m = (uint8_t)(GetSize() - (uint32_t)1 + index_m) % GetSize(); // info 834: operator '-' followed by operator '+' could be confusing without parentheses [MISRA 2004 Rule 12.1, advisory]
这让我摆脱了符号/无符号混合问题,但是这个“运算符'-'后跟运算符'+'”仍然很奇怪!
【问题讨论】:
-
这是您应该使用
int或更大类型的部分原因。小于int的所有内容都将转换为int/unsigned int以进行内置操作。 -
我也尝试过使用大于 uint8_t 的 uint16_t。和同样的警告。
-
在 32 位机器中,
int将是int32_t。如果您想要无符号,那么uint32_t将是内置运算符的最小类型。 -
因为
uint16_t小于int(和unsigned int)... -
鉴于来自
index_m = (GetSize() - 1U + index_m) % GetSize();的警告,您是否尝试过index_m = (GetSize() + index_m - 1U) % GetSize();?
标签: c++ c static-analysis