我正在编写一个处理一些注释的软件。注释的参数之一是数组。一个对象找到这个数组并将它传递给另一个对象来处理它。然后 findbugs 开始尖叫我正在传递一个可能被恶意代码变异的私有数组。所以问题是:这是真的吗?可以在运行时更改注释参数吗?
问问题
197 次
2 回答
2
这是真的:您传递对数组的引用,并且数组是可变的。被调用者可以修改这个数组。
您最好的做法是将该数组的副本而不是原始数组传递给被调用者,例如使用Arrays.copyOf()
.
或者,您可能希望返回 a 而不是数组,List
并使用Collections.unmodifiableList()
包装器,因为这将避免不必要的副本。
于 2012-12-23T14:20:35.950 回答
0
通过反射返回的数组每次检索时都应该是一个新的副本,所以没有问题。
从移动代码或一般代码质量的角度来看,您应该期望返回的数组或作为参数传递给不受信任的方法的数组被恶意修改。同样在接收方,作为参数传递或从回调返回的数组可能会在以后被恶意修改。因此,在分发它们之前以及在接收它们时需要复制数组(甚至在任何验证之前)。
@fge 提到List
s。将这些发送出去时,接收方无法修改不可修改的集合。接收收藏有点棘手。显然,拿一个不受信任的List
东西包装起来是unmodifiableList
行不通的。new ArrayList<>(things)
是要走的路。不要尝试clone
恶意ArrayList
,因为您无法确定clone
实际操作。
显然,如果您有一个可变对象数组,则需要复制数组和元素。
于 2012-12-24T15:11:27.320 回答