警告来自以下给定的代码集,该警告会在编译代码期间产生影响。这里有3组代码在所有代码中给出,警告即将到来。
首先:
unsigned long Get_TestVal(unsigned int B_Index)
{
unsigned long val = 0;
if((B_Index >= 0) && (B_Index < 16)) // condition is always true: warning came
val = 1;
else if((B_Index >= 16) && (B_Index < 32))
val = 2;
.....
return (val);
}
第二
for(i =0 ; i < 2; i++)
{
if((Buffer[i] >= 0) && (Buffer[i]<= 9) ) // condition is always true: warning came
{
Buffer[i] = Buffer[i] + 48;
}
}
第三:
if(val < 0)// condition is always false :warning came
{
flag = HMP_LO;
}
答案 0 :(得分:2)
由于B_Index
和val
都属于unsigned long
类型,因此它们(根据定义)永远不会小于零(即负数)。这是警告告诉你的第一个和最后一个案例。
您没有显示Buffer
的声明,因此很难提供帮助。
答案 1 :(得分:2)
请检查B_Index
的数据类型。它说unsigned int
始终保证>= 0
的值[即使在溢出之后]。这就是代码if((B_Index >= 0)...
的警告。
与unsigned long val
相同,if(val < 0)
始终 FALSE 。
最后,我认为我们可以安全假设,如果if((Buffer[i] >= 0)
,Buffer
属于unsigned
数据类型,则警告背后的原因相同作为第一个案例。
解决方案: 您可以安全地删除这些特定条件检查。
答案 2 :(得分:0)
在第一个示例中,B_Index的类型为unsigned int
,因此B_Index始终大于或等于0.
在第二个和第三个示例中,您没有为Buffer[i]
或val
指定类型,但我认为类似的条件成立。
答案 3 :(得分:0)
1)警告由条件B_Index >= 0
生成,只要您使用unsigned
,就可以安全地将其删除。
2)在这里,假设Buffer是类似于unsigned
的数组,警告由条件Buffer[i] >= 0
生成,只要您使用unsigned
,就可以安全地删除它}。
3)这里的原则相同。警告由val < 0
生成,如果您预计不应使用负数unsigned
。
额外)您应该针对unsigned
文字进行测试,例如:index == 1u
。最后的u
告诉编译器文字应该是unsigned
。