当前位置: 首页 > 知识库问答 >
问题:

FindBugs引发由数组引起的名为EI_EXPOSE_REP的bug

贺善
2023-03-14

FindBugs引发一个名为EI_EXPOSE_REP的bug,其描述如下:

EI:可以通过返回对可变对象的引用来公开内部表示

返回对存储在对象字段之一中的可变对象值的引用将公开该对象的内部表示形式。如果实例由不受信任的代码访问,并且对可变对象的未经检查的更改会危及安全性或其他重要属性,则需要执行不同的操作。在许多情况下,返回对象的新副本是更好的方法。

class Person {
    private String[] hobbies;
    String[] getHobbies(){ return hobbies;}
    void setHobbies(String[] hobbies){ this.hobbies = hobbies;}
}
    null

共有1个答案

羊舌涵涤
2023-03-14

Findbugs(现在被Spotbugs取代)引发了一个安全问题。它不是bug,因为它本身不会产生不想要的行为。但是这种内部数据的公开可能会在以后的调用方方法中产生bug。

你猜对了,有两种方法可以保护你的吸气剂免受暴露:

  • 返回具有arrays.copyOf(..)
  • 的数组副本
  • 使用collections.unmodifiableList(..)将其转换为“不可变”列表(您也可以使用List.of(..),因为Java9)

在某些情况下,当您只有少量的写操作和大量的读操作时,CopyOnWriteArrayList类是一个很好的选择,而不是简单的不可变列表getter。

我想知道的是为什么just array会引发这个bug。
这只是一个警告。Findbugs在报表旁边显示严重级别。
对于安全性来说,暴露是中等级别,但是对于bug来说是低级别。

列表没有这个问题?
确实有。ArrayList只是一个带有额外抽象层的数组。

 类似资料:
  • 当我试图运行下面的代码时,每次我都得到错误“org.openqa.selenium.timeoutexception:Expected condition failed:waiting for visibility of element Locited by by.xpath”,我不确定xpate会是什么,请有人帮助我为登录应用程序创建自动化测试用例。 Java: HTML:

  • 问题内容: 我要寻找一个量化的方式来索引的索引。 例如: 我想建立一个新的数组,以便该数组中的每一行(i)都是array的row(i),并由数组inds(i)的行索引。我想要的输出是: 我可以通过循环来实现: 但我正在寻找一种纯矢量化的解决方案。 问题答案: 使用索引数组对另一个数组进行索引时,每个索引数组的形状应与 输出 数组的形状匹配。您希望列索引匹配,并且您希望行索引匹配输出的行,例如: 由

  • 问题内容: 我正在使用以下方法从webapi捕获数据: 对于某些请求,这会由于HeapSize太小而导致OutOfMemoryError: 我已经从正常的String操作(如StringBuilder)换成了StringBuilder,但这没有帮助。我怎么解决这个问题?通过isnt作为其Android应用程序的一个选项来增加最大堆大小。 问题答案: 一种解决方案是将要下载的内容持久保存到存储中。

  • 此请求不使用2D数组。考虑以下结构的1D数组,其中索引从零开始,长度从一开始: 节0是单个单元格的数组。 第1节 null null null null 到目前为止,我使用一个语句的公式只能获得第一节(不是第2节或第3节)。希望找到一组公式来实现目标,而不使用语句或循环。以下是我目前掌握的信息:

  • 我尝试在Gradle上创建IntelliJ插件构建。这是我对它的GitHub回购https://GitHub.com/vladimirkozhaev/testgradleIntellijPlugin Ide是IntelliJ Ide 我错在哪里?相同版本的插件,但基于IDE运行良好