【问题标题】:Sonar is wrongly reporting Remove this expression which always evaluates to "true"声纳错误报告删除这个总是评估为“真”的表达式
【发布时间】:2019-07-08 13:23:06
【问题描述】:

如果我有这个代码声纳不会抱怨:

if (null != myResponse) {
     // some code
}

但是如果我在上面放一行代码

getEmptyListForNull(myResponse).forEach(this::method);

然后声纳报告这个奇怪的错误。 sonar 怎么知道getEmptyListForNull 做了什么,这并不重要。

显然声纳认为代码是这样的:

myResponse.forEach(this::method);

getEmptyListForNull 方法是一个简单的方法,它执行null 检查,如果是,则返回一个空列表。没有其他注释或任何花哨的东西。

【问题讨论】:

  • getEmptyListForNull 是您的代码吗?你能分享一下实现吗?
  • @Tom 这有什么关系?它不会修改myResponse
  • 重要的是它如何反应它对传递 null 的反应。如果使用 @Nullable@NotNull 之类的注释,这很重要。
  • @Tom 我现在明白了,我的问题已更新为更多详细信息。

标签: java nullpointerexception sonarqube


【解决方案1】:

实际上 SonarQube 不知道您的功能。这与您的功能无关。它是关于 forEach() 的。

如果您可以使用 .forEach() 遍历集合而不抛出异常,则表示该集合不为空。

import java.util.List;

public class NoFalsePositiveHere{

     public static void main(String []args){

        List<String> nullList = null;

        nullList.forEach(s -> System.out.println(s));

        if(nullList != null){
            System.out.println("Since an exception is already thrown on line 9,");
            System.out.println("this block is unreachable.");
            System.out.println("It means that,");
            System.out.println("if no exception was thrown on line 9,");
            System.out.println("You could see these lines on console.");
        }
     }
}

如果第 9 行抛出异常,则不执行第 11 行。

如果第9行没有抛出异常,则表示该列表不为空。

【讨论】:

  • 你是对的。我不会在myResponse 上为每个人打电话,我不会在getEmptyListForNull(myResponse) 上为每个人打电话。它应该能够识别!
  • 其实,你在myResponsegetEmptyListForNull(myResponse)上打过.foreach()都没有关系。关键是:如果您在任何对象上调用了.forEach(),并且它等于null; NullPointerException 被抛出。如果没有抛出此异常,则表示该对象不为空。所以,你不需要检查它是否等于 null。
  • 此外,恕我直言,这不是误报。 sonarqube 知道您已经在作为方法返回的对象上调用了.forEach()。但是由于它不知道(也不关心)你在这个方法中做了什么,所以这个方法有可能返回 null 对象。
  • 为了得到最好的解决方案,恕我直言,你必须在.forEach()迭代之前检查列表,并且只有当它等于null时才初始化它。
  • 在这种情况下,它永远不会抛出 NullPointerException,因为即使 myResponse 为空,getEmptyListForNull 也会返回并清空列表。
【解决方案2】:

对您的示例进行更多说明会有所帮助,但在搜索 Sonar 文档 https://rules.sonarsource.com/java/type/Bug/RSPEC-1145?search=expression 时,我发现了一个可能与您正在执行的操作非常相似的示例。

http://cwe.mitre.org/data/definitions/571.html

在上面链接中提到的示例中,方法中从未设置过一个变量。由于我无法看到你的方法做了什么,我猜 Sonar 在你的代码中检测到类似的东西。

您能否编辑您的问题以更深入地了解您的函数的作用,并验证是否发生了类似的事情?

我很抱歉没有简单地发表评论;我的声誉不允许这样做,但还想提供指向文档站点的链接,因为通常可以在那里找到好的建议和答案。

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 2021-06-03
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    相关资源
    最近更新 更多