【问题标题】:Sonar false positive, "change condition so that it does not always evaluate to true."声纳误报,“改变条件,使其并不总是评估为真。”
【发布时间】:2018-08-17 00:38:02
【问题描述】:

Sonar 正在为以下代码提出“更改此条件,使其不总是评估为真”。我咨询了很多人,他们都认为这是误报,是不是我们遗漏了什么?

public SearchResponse getSearchResponse(SearchRequest searchRequest) {
    try {
        searchRequest.validate();
    } catch(VerifyException e) {
        ///some code to make errorResp
        return errorResp
    } catch(Exception e) {
        String key = searchRequest != null ? serchReqeust.getKey() : null;
        Logger.log("some text {}", key);
        //some code to make errorResp
        return errorResp;
    }
}

searchRequest != null 的通用catch 块中引发了错误。 但是,如果 searchRequest 为 null,try 块中的第一行将抛出 NullPointerException,如果我不在 catch 块中检查 null,它将在我的 catch 块中再次中断。让我的方法再次失败,这是我不想要的。

编辑:

由于 cmets 中的一些人要求提供代码来重现错误,我已将其上传到 github https://github.com/shariqislam786/test,这个问题也可以在 eclipse 中使用 sonar lint 3.4 重现。

【问题讨论】:

  • 也许在try 之前做一个if (searchRequest != null) { 以便您知道searchRequest 是好的? Sonar 是否假设唯一可能的其他异常是NullpointerException
  • 您的 SonarJava 版本是多少?您可以在 Administration > Marketplace 中找到它。
  • key != null ? key : null == key.
  • @AndyTurner 实际上它的第一行尝试声纳告诉我暗示 searchRequest 在异常块中不能为空。

标签: java sonarqube code-analysis sonarlint


【解决方案1】:

SonarJava 分析器 (5.1.1) 的符号执行引擎引发了一个问题,因为它假定到达catch 块的唯一方法是至少让searchRequest 不是null。这是引擎的限制,暂时不包括这些情况。以下票证跟踪此限制:SONARJAVA-2669

现在,正如您所说,没有什么能阻止您调用参数为null 的方法。在这种情况下,NullPointerException 将被抛出,事实上,我们将到达catch (Exception e) 块,searchRequestnull

SonarJava 因此引发了误报

现在,关于您的实现选择,我相信像这样处理null-case(依靠抛出的异常)并不是人们通常期望的。输入方法时明确的null-check 通常更清晰,应该是首选。

请注意,作为一种好的做法,我认为使用@javax.annotation.Nullable 或一些类似的nullness 注释来注释方法的searchRequest 参数会更清晰(这个来自@987654322 @)。这将有助于其他开发人员(和 SonarJava 引擎)了解您可以在哪种状态下提供参数,并使其一目了然。

【讨论】:

  • 是否可以禁用此特定错误?我不想禁用整个规则。
  • 没有对引擎的大部分进行返工,很遗憾没有。我鼓励您将问题作为“误报”结束
猜你喜欢
  • 2017-06-12
  • 2018-02-10
  • 2016-05-14
  • 2020-01-11
  • 2016-11-25
  • 2018-10-04
  • 2020-06-01
  • 2017-01-22
  • 1970-01-01
相关资源
最近更新 更多