【问题标题】:Byte[] May expose internal representation of the returning reference - findbug [duplicate]Byte[] 可能会暴露返回引用的内部表示 - findbug [重复]
【发布时间】:2019-06-04 12:19:15
【问题描述】:

我正在使用一些旧代码在一个旧项目中工作,而 findbug 给出了以下带有字节 [] 的错误。

FindBugs:可能会通过合并来暴露内部表示 对可变对象的引用 此代码存储对可变对象的引用 外部可变对象转化为内部表示 目的。如果实例被不受信任的代码访问,并且未选中 对可变对象的更改会危及安全性或其他 重要的属性,你需要做一些不同的事情。存储 在许多情况下,对象的副本是更好的方法。

我想知道是否有人可以帮助我了解处理此错误的正确方法?

private byte[] fileContent;

public FileUpload(String fileName, String fileExtension, long fileSize, byte[] fileContent, boolean attachedToPo, boolean programOwner) {
        this.fileName = fileName;
        this.fileExtension = fileExtension;
        this.fileSize = fileSize;
        this.fileContent = fileContent;
        this.attachedToPo = attachedToPo;
        this.programOwner = programOwner;
    }

public byte[] getFileContent() {
    return fileContent;
}

public void setFileContent(byte[] fileContent) {
    this.fileContent = fileContent;
}

编辑 我理解为什么存在这个错误,并且我知道如何处理日期等问题。我只是对如何处理字节 [] 感到有点困惑。

【问题讨论】:

  • 检查 getFileContent() 的所有用法,看看结果字节数组是如何使用的。如果未修改,则无需修复。
  • 您的对象字节是一个可变元素,这意味着如果您通过在代码的其他部分进行修改来返回该对象,那么您的类中也将被修改。换句话说,它作为引用工作,以避免这个问题返回你的对象的副本而不是你的对象
  • 为了修复警告,您需要将 setter 更新为:this.fileContent = (fileContent == null) ? null : fileContent.clone();

标签: java


【解决方案1】:

getFileContent() 返回您在内部存储的字节数组。另一个得到 this 的类可能会开始修改它,从而也改变原始类中的字节数组。 getFileContent() 应该返回数组的副本,而不是数组实例本身。

【讨论】:

  • 你能提供一个如何复制它的例子吗?我有点挣扎。
  • 使用 System.arraycopy(...)
  • setteR 怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
相关资源
最近更新 更多