【问题标题】:How to check array visit may out of bounds using sonarqube?如何使用 sonarqube 检查数组访问是否越界?
【发布时间】:2018-11-16 04:39:00
【问题描述】:

如何使用 sonarqube 检查数组是否越界?现有规则中对此没有任何规定。自定义规则?

我想查找没有索引检查的数组访问。

不合规代码示例

String[] spiltResults = chatString.split(ch);
result = spiltResults[0];

合规解决方案

String[] spiltResults = chatString.split(ch);
if(spiltResults.length > 0){
    result = spiltResults[0];
}

【问题讨论】:

  • 数组不会越界。这是程序员允许使用的无效索引超出范围。你到底想做什么?
  • @Stultuske 我已经编辑了问题。
  • 我不确定这样的规则是否存在。但我很确定你可以添加自己的规则

标签: java sonarqube indexoutofboundsexception sonarqube-scan


【解决方案1】:

您可以在 SonarCube 中实现自定义规则,该规则要求在任何数组下标操作之前进行明确的边界检查。

但是,有几个问题:

  1. 测试总是有明确的检查相对容易。

  2. 更难测试检查是否正确。

  3. 当索引表达式超出范围时,很难测试是否采取了正确的操作。

  4. 很难处理程序员遗漏了不必要的检查、取消循环检查或类似情况的代码。

这就是问题所在。如果您可以实现执行 1) 和 2) 而不是 3) 和 4) 的自定义规则,那么最终结果将是您鼓励程序员编写带有冗余检查的丑陋代码以使 SonarCube“闭嘴”。这是一件坏事,对于真正的代码质量而言,可能更糟糕比根本不实施规则。

更好的方法是彻底测试。无论如何,你应该这样做。 (依靠代码分析器来查找错误是个坏主意。)

确实,您可能会争辩说,当存在错误时,最好让代码抛出索引检查异常,而不是鼓励程序员添加可能实际上使真正的错误更难找到的草率范围检查代码。


FWIW,SonarCube 很可能对此没有标准规则。这样的规则会产生太多的误报,对现实世界的代码库没有用处。

【讨论】:

  • 不错的帖子,很有用:)
猜你喜欢
  • 2018-04-03
  • 2018-06-21
  • 1970-01-01
  • 2021-11-29
  • 2012-11-04
  • 1970-01-01
  • 2012-03-31
相关资源
最近更新 更多