Javascript IFs (sonar false positive?)



我刚刚在SonarQube中发现了一个误导性的问题,我们有如下代码 (JS(

{…}
function test(searchQuery, role) {
console.log("inputs: " +searchQuery + ", " + role );
    if (!searchQuery && role) {
        console.log("first");
    }
    if (searchQuery && !role) {
        console.log("sec");
    }
    if (searchQuery && role) {
        console.log("3");
    }
    console.log("END");
}
{…}

Sonarqube(6.7.4(将最后一个如果标记为带有注释的问题,应该修复它以避免每次都true(在第一个IF中实际上有一个返回,我修改了代码以进行测试(

使用测试值,输出为:

inputs: aaa, fff
test.txt.html:14 3
test.txt.html:16 END
test.txt.html:6 inputs: null, fff
test.txt.html:8 first
test.txt.html:16 END
test.txt.html:6 inputs: null, null
test.txt.html:16 END

我不是javascript专家,只是发现很有趣,有人知道吗,if there is any reason why the last if should be everytime true?因为我不这么认为,所以注册测试数据。

如果要将返回放在前两个 IF 中以使其就位,则代码将在两种情况下继续: - 如果两个变量都设置了,或者两个变量都为 null,但if (null, null)应该返回 undefined,不是吗?

感谢您的任何澄清

如果您给出实际分析的代码以及您在 SonarQube 中遇到的确切问题,那么帮助您会更容易。我无法重现您发布的代码的任何问题,但我可以在每个if块中重现带有return语句的代码(基于消息末尾的注释(。

function test(searchQuery, role) {
    if (!searchQuery && role) {
        return;
    }
    if (searchQuery && !role) {
        return;
    }
    if (searchQuery && role) {
        return;
    }
}

然后,SonarQube 在第三个if语句的条件下突出显示role,并提出以下问题:重构此代码,以便此表达式的计算结果并不总是为 true。

searchQuery为真而role为假时,第二个if语句的条件为真,并执行第二个return语句。这意味着,当searchQuery在第三个if陈述的条件下是真实的时,role不可能是假的。换句话说,可以从第三个if语句的条件中删除role,而不会影响行为。

最新更新