为什么SonarQube会抱怨这部分代码?
我检查了这段代码并不总是这个值是真的。
public static void WriteJson(object value)
{
decimal decimalValue = ((decimal?)value).Value;
int intValue = (int)decimalValue;
if (decimalValue == intValue)
Console.WriteLine(intValue);
else
Console.WriteLine(decimalValue);
Console.ReadKey();
}
为什么SonarQube抱怨这个?
答案 0 :(得分:7)
误报与我们的数据流分析引擎中的不完美有关 - 它没有考虑浮点数和整数之间的转换(尚未),并且无法识别浮点数何时被截断。
我将尝试详细说明:数据流分析引擎跟踪分析方法中局部变量的值,并且当将新值分配给变量时,引擎会创建一个表示实际值的特殊对象。将一个变量分配给另一个变量时,该对象保持不变。例如:
var x = 5; // the symbol of x is associated with value_0
var y = x; // the symbol of y is associated with value_0
if (x == y) // value_0 is compared with value_0 --> always true
我们分配的值不包含类型信息(尚未),我们无法检测(如果)您的情况下的更改:
var x = 5.5; // the symbol of x is associated with value_0
var y = (int)x; // the symbol of y is associated with value_0 (wrong)
if (x == y) // false positive
我们会产生误报,但它们相对较少,因为大多数演员阵容都不会产生新值。
感谢您的反馈,我们将调查in the near future。
答案 1 :(得分:1)
看起来SonarQube检测到您为两个变量分配了相同的值,假设传递给方法的值等于2
1. decimal decimalValue = 2
2. int intValue = (int)decimalValue;
因此decimalValue = 2
和intValue = 2
C#编译器显然会将其转换为int
,因此,如果您通过2.5
,if
比较将不会始终评估为true
。但很可能SonarQube只是不知道铸造。所以它假定总是如此。
答案 2 :(得分:0)
我不是SonarQube的专家,但我想这是因为SonarQube检测到您将intValue
设置为圆decimalValue
形式。然后,您再次将decimalValue
与intValue
的小数形式进行比较。因此,在许多情况下,它将返回'true'。
要查看它将如何发挥作用,假设decimalValue为“123.0”。然后,intValue将正好是“123”。然后,我们将“123.0”(decimalValue的值)与“123.0”(转换为十进制后的intValue的值)与“if”语句进行比较,该语句将返回true。这将适用于所有整数。