Java 将字段设置为 null 时取消引用 Null - Fortify
Java Null Dereference when setting a field to null - Fortify
当我将字段设置为 null 时,Fortify 抱怨 Null Dereference:
String sortName = null;
if (lastName != null && lastName.length() > 0) {
sortName = lastName;
}
sortOptions.setSortField(sortName); <-- Fortify Null Dereference
Fortify 的分析跟踪说:
Assigned null: sortName
Branch taken: if (lastName != null && lastName.length() > 0)
Dereferenced: sortName
我可以试试:
if (sortName == null)
sortOptions.setSortField(null);
else
sortOptions.setSortField(sortName);
但这看起来真的很傻。有人有这方面的经验吗?我宁愿摆脱这个发现,也不愿将其注销。
fortify 不喜欢的是你先用 null
初始化变量,没有条件,然后再改变它。
这应该有效:
String sortName;
if (lastName != null && lastName.length() > 0) {
sortName = lastName;
} else {
sortName = null;
}
sortOptions.setSortField(sortName);
(如果您愿意,也可以使用三元运算符)
这样你只初始化 sortName
一次,并且明确地表明 null
值在某些情况下是正确的,而不是你忘记了某些情况,导致 var 保持 null
而这是意想不到的。
Null dereference 错误出现在代码行 sortName = lastName;
而不是 setter 的调用:fortify 不希望您有条件地更改未在所有分支中设置为 null
的变量值。
Thierry 的回答很有效。这也通过了 Fortify 的扫描:
Optional<String> sortName = Optional.empty();
if (lastName != null && lastName.length() > 0) {
sortName = Optional.ofNullable(lastName);
}
sortOptions.setSortField(sortName.orElse(null));
当我将字段设置为 null 时,Fortify 抱怨 Null Dereference:
String sortName = null;
if (lastName != null && lastName.length() > 0) {
sortName = lastName;
}
sortOptions.setSortField(sortName); <-- Fortify Null Dereference
Fortify 的分析跟踪说:
Assigned null: sortName
Branch taken: if (lastName != null && lastName.length() > 0)
Dereferenced: sortName
我可以试试:
if (sortName == null)
sortOptions.setSortField(null);
else
sortOptions.setSortField(sortName);
但这看起来真的很傻。有人有这方面的经验吗?我宁愿摆脱这个发现,也不愿将其注销。
fortify 不喜欢的是你先用 null
初始化变量,没有条件,然后再改变它。
这应该有效:
String sortName;
if (lastName != null && lastName.length() > 0) {
sortName = lastName;
} else {
sortName = null;
}
sortOptions.setSortField(sortName);
(如果您愿意,也可以使用三元运算符)
这样你只初始化 sortName
一次,并且明确地表明 null
值在某些情况下是正确的,而不是你忘记了某些情况,导致 var 保持 null
而这是意想不到的。
Null dereference 错误出现在代码行 sortName = lastName;
而不是 setter 的调用:fortify 不希望您有条件地更改未在所有分支中设置为 null
的变量值。
Thierry 的回答很有效。这也通过了 Fortify 的扫描:
Optional<String> sortName = Optional.empty();
if (lastName != null && lastName.length() > 0) {
sortName = Optional.ofNullable(lastName);
}
sortOptions.setSortField(sortName.orElse(null));