更改此条件,以便它不会始终评估为' true'

时间:2017-09-01 09:05:52

标签: c# .net sonarqube

为什么SonarQube会抱怨这部分代码?

enter image description here

我检查了这段代码并不总是这个值是真的。

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抱怨这个?

3 个答案:

答案 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 = 2intValue = 2

C#编译器显然会将其转换为int,因此,如果您通过2.5if比较将不会始终评估为true。但很可能SonarQube只是不知道铸造。所以它假定总是如此。

答案 2 :(得分:0)

我不是SonarQube的专家,但我想这是因为SonarQube检测到您将intValue设置为圆decimalValue形式。然后,您再次将decimalValueintValue的小数形式进行比较。因此,在许多情况下,它将返回'true'。

要查看它将如何发挥作用,假设decimalValue为“123.0”。然后,intValue将正好是“123”。然后,我们将“123.0”(decimalValue的值)与“123.0”(转换为十进制后的intValue的值)与“if”语句进行比较,该语句将返回true。这将适用于所有整数。