ID: 375 类型:基础 | 状态:草稿 |
描述
将非克隆可变数据作为返回值发送可能会导致调用函数更改或删除该数据。
扩展描述
在函数返回对可变数据的引用的情况下,调用函数的外部代码可能会对发送的数据进行更改。如果以前没有克隆此数据,那么类将使用修改过的数据,这可能会违反对其内部状态的假设。
关联视图
与“研究层面”视图(CWE-1000)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 | 说明 |
实现 |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
Java (出现的可能性不确定)
C# (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
访问控制 | 技术冲击: 修改内存 数据可能被其它函数修改。 |
被利用的可能性:
一般
示例
例1
这个类有一个私有的病人列表,并提供了一个查阅病人列表的方法:
(问题代码)
Example Language: Java
public class ClinicalTrial {
private PatientClass[] patientList = new PatientClass[50];
public getPatients(...){
return patientList;
}
}
虽然此代码只意味着允许读取患者列表,但getPatients()方法返回对类原始患者列表的引用,而不是对列表副本的引用。此方法的任何调用方都可以任意修改患者列表的内容,即使它是类的私有成员。
应对措施
阶段: 实现 声明返回的数据不应更改为常量或不可变。 |
阶段: 实现 在返回引用之前克隆所有可变数据。这是首选的缓解措施。这样,不管对数据做了什么更改,都会保留一个有效的副本供类使用。 |
种属