首页 > 解决方案 > 恶意代码漏洞 - 可能通过返回对 int[] 的可变对象的引用来暴露内部表示

问题描述

我在使用 Java 语言时遇到了 Sonar 的问题,代码如下。Sonar 声明“恶意代码漏洞 - 可能通过返回对可变对象的引用来暴露内部表示”。

private int[] integerArray = {1, 2, 3, 4};

public int[] getIntegerArray()
{
    return integerArray;
}

'primitive'+'[]' 的各种数组都是可变的?

如何解决这个问题,仍然返回一个int数组?

如果不是 int[],而是 String[]、StringBuilder 或 AnyObject[],该怎么办?解决方案是什么?

标签: javarefactoring

解决方案


这里的问题是该getIntegerArray()方法的调用者可以更改其内容:

int[] arr = yourObject.getIntegerArray();
arr[0] = 12345;

System.out.println(yourObject.getIntegerArray()[0]); // prints 12345.

所有数组通常都是可变的——无论是原始元素还是引用元素——除了数组长度为零的特定情况。

解决方案 - 如果您需要返回一个数组 - 是在返回之前制作一个数组的副本:

return Arrays.copyOf(integerArray, integerArray.length);

此解决方案适用于任何阵列。


推荐阅读