【问题标题】:Javascript IFs (sonar false positive?)Javascript IF(声纳误报?)
【发布时间】:2019-07-05 03:10:37
【问题描述】:

我刚刚在 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? 因为我不这么认为,注册。测试数据。

如果您将 return 放置在前两个 IF 中,则代码将在两种情况下继续: - 如果两个变量都设置了,或者两者都为空,但if (null, null) 应该返回未定义,不是吗?

感谢您的澄清

【问题讨论】:

  • 在没有看到您的实际代码的情况下,可能是 sonarqube 正在检测(可能是错误的)当代码通过您的前两个 IF 时,另一个 IF 是不必要的,尤其是在您返回时。跨度>
  • 啊,这可能是个问题,因为当代码通过第三个 if 时,有一个“通用”返回,实际上是另一个值,然后所有之前的 if 都有,但是是的,可能来自从扫描仪的角度来看,结果是这样的,无论如何感谢您的想法

标签: javascript sonarqube


【解决方案1】:

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

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

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

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

【讨论】:

  • 嗨,皮埃尔,感谢您的解释,这正是问题所在,但如果我是正确的,那么-您将call function with both of variables set to false 值,然后first if did not match, second not, as well, but also third one will don't match the condition,不是吗?在这种情况下,如果我是正确的,或者我错过了什么,代码将继续下面避免 IF 块的所有条件?
  • SonarQube 并不暗示第三个 if 语句的完整条件始终为真。只有 role 子条件在这里是多余的,可以在不影响行为的情况下删除它:if (searchQuery) {...}
  • 啊,我想我明白了,所以从技术上讲,它只能测试第一个(searchquery)参数,因为这两种情况都已经在上面的代码中测试过了。因此,正如您所提到的,一旦代码到达那里,就意味着角色已经是真实的。感谢您的澄清,祝您有美好的一天。
猜你喜欢
  • 2021-09-12
  • 1970-01-01
  • 2012-11-24
  • 2023-04-01
  • 1970-01-01
  • 2012-08-17
  • 2020-10-15
  • 1970-01-01
  • 2018-06-20
相关资源
最近更新 更多