如何使用sonarqube检查数组访问是否越界?

How to check array visit may out of bounds using sonarqube?

如何使用sonarqube检查数组是否越界?现有规则中没有这方面的内容。自定义规则 ?

我想查找不带索引检查的数组访问

不合规的代码示例

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

合规解决方案

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

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

但是,有几个问题:

  1. 总有显式检查,比较容易测试

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

  3. 很难测试当索引表达式越界时是否采取了正确的操作。

  4. 很难处理程序员遗漏了不必要的检查、将检查提升到循环之外或类似情况的代码。

问题来了。如果您可以实施执​​行 1) 和 2) 但不执行 3) 和 4) 的自定义规则,那么最终结果将是您鼓励程序员编写带有冗余检查的丑陋代码来制作 SonarCube "just shut up"。这是一件坏事,对于真正的代码质量来说,可能 比根本不执行规则更糟糕

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

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


FWIW,SonarCube 很可能没有这方面的标准规则。这样的规则会产生太多误报,无法用于现实世界的代码库。