声纳误报,“改变条件,使其并不总是评估为真。”
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)
块,searchRequest
是null
。
SonarJava 因此引发了误报。
现在,关于您的实现选择,我相信像这样处理null
-case(依靠抛出的异常)并不是人们通常期望的。输入方法时明确的null
-check 通常更清晰,应该是首选。
请注意,作为一种好的做法,我认为使用@javax.annotation.Nullable
或一些类似的nullness 注释来注释方法的searchRequest
参数会更清晰(这个来自@987654322 @)。这将有助于其他开发人员(和 SonarJava 引擎)了解您可以在哪种状态下提供参数,并使其一目了然。
【讨论】:
是否可以禁用此特定错误?我不想禁用整个规则。 没有对引擎的大部分进行返工,很遗憾没有。我鼓励您将问题作为“误报”结束以上是关于声纳误报,“改变条件,使其并不总是评估为真。”的主要内容,如果未能解决你的问题,请参考以下文章