声纳误报,“改变条件,使其并不总是评估为真。”

Posted

技术标签:

【中文标题】声纳误报,“改变条件,使其并不总是评估为真。”【英文标题】: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 另见Why shouldn't a method throw multiple types of checked exceptions? 您的 SonarJava 版本是多少?您可以在 Administration > Marketplace 中找到它。 key != null ? key : null == key. @AndyTurner 实际上它的第一行尝试声纳告诉我暗示 searchRequest 在异常块中不能为空。 【参考方案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 引擎)了解您可以在哪种状态下提供参数,并使其一目了然。

【讨论】:

是否可以禁用此特定错误?我不想禁用整个规则。 没有对引擎的大部分进行返工,很遗憾没有。我鼓励您将问题作为“误报”结束

以上是关于声纳误报,“改变条件,使其并不总是评估为真。”的主要内容,如果未能解决你的问题,请参考以下文章

如何修复线性 SVM 的误报率?

如何在 spotbug 报告中标记误报

如何避免 SQL 查询检查 IS NULL 的误报?

“每个窗口的误报”的含义

每次我们重新发布软件时如何阻止防病毒误报?

OWASP ZAP - 如何“证明”误报?