为什么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();
}
Run Code Online (Sandbox Code Playgroud)
为什么SonarQube抱怨这个?
误报与我们的数据流分析引擎中的不完美有关 - 它没有考虑浮点数和整数(尚未)之间的转换,并且无法识别浮点数何时被截断.
我将尝试详细说明:数据流分析引擎跟踪分析方法中局部变量的值,并且当将新值分配给变量时,引擎会创建一个表示实际值的特殊对象.将一个变量分配给另一个变量时,该对象保持不变.例如:
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
Run Code Online (Sandbox Code Playgroud)
我们分配的值不包含类型信息(尚未),我们无法检测(如果)您的情况下的更改:
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
Run Code Online (Sandbox Code Playgroud)
我们产生误报,但它们相对较少,因为大多数演员不会产生新值.
感谢您的反馈,我们将在不久的将来对此进行调查.