如何修改代码解决SonarQube规则squid:S2384漏洞:返回deductionfrequency副本
解决SonarQube squid:S2384漏洞的代码修改方案
squid:S2384规则触发的原因是直接返回了可变集合成员变量的引用,外部调用者可通过该引用修改集合内部数据,破坏类的封装性,同时导致数据变更不可预测(对应漏洞标签里的unpredictable)。修复核心是返回集合的副本或不可变包装,避免外部直接操作原集合。
以下是几种可行的修改方案:
返回ArrayList副本:创建新集合复制原元素,彻底隔离原集合与返回值
public List<String> getDeductionfrequency() { return new ArrayList<>(deductionfrequency); }外部修改返回的集合不会影响原成员变量,适合需要允许外部修改返回集合但不影响内部数据的场景。
返回不可变集合(Java 9+):利用
List.copyOf()生成不可变集合public List<String> getDeductionfrequency() { return List.copyOf(deductionfrequency); }返回的集合无法被修改,安全性更高,但如果原集合为
null会抛出NullPointerException,需提前处理空值。返回不可修改的集合包装:用
Collections.unmodifiableList()包装原集合import java.util.Collections; public List<String> getDeductionfrequency() { return Collections.unmodifiableList(deductionfrequency); }外部尝试修改会抛出
UnsupportedOperationException,但原集合内部的变更会同步到返回的包装集合中,适合仅需防止外部修改的场景。
空值处理补充
如果原集合可能为null,建议添加空值判断避免异常:
public List<String> getDeductionfrequency() { return deductionfrequency == null ? Collections.emptyList() : new ArrayList<>(deductionfrequency); }
内容的提问来源于stack exchange,提问作者user23862738
相关产品推荐
相关产品推荐

