我刚刚在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
,而不会影响行为。