Java Обнуление разыменования при установке поля в нуль - Fortify - PullRequest
0 голосов
/ 04 июня 2019

Fortify жалуется на нулевую разыменование, когда я устанавливаю поле в null:

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);

Но это кажется очень глупым.У кого-нибудь есть опыт работы с этим?Я бы предпочел избавиться от находки, а не списывать ее со счетов.

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

Что не нравится в fortify, так это то, что вы сначала инициализируете переменную с помощью null без условий, а затем измените ее.

это должно работать:

String sortName;
if (lastName != null && lastName.length() > 0) {
   sortName = lastName;
} else {
   sortName = null;
}
sortOptions.setSortField(sortName);

(Или используйте троичный оператор, если хотите)

Таким образом, вы инициализируете sortName только один раз и явно показываете, что значение null является правильным в некоторых случаях, а не то, что вы забыли некоторые случаи,приводя к тому, что переменная остается null пока она неожиданна.

Ошибка Разыменование нулевого значения произошла в строке кода sortName = lastName;, а не вызовом установщика: fortify не хотят, чтобы выусловно изменить значение переменной, которая была установлена ​​на null, не делая этого во всех ветвях.

0 голосов
/ 04 июня 2019

Ответ Тьерри прекрасно работает.Это также проходит сканирование Fortify:

Optional<String> sortName = Optional.empty();
if (lastName != null && lastName.length() > 0) {
   sortName = Optional.ofNullable(lastName);
}
sortOptions.setSortField(sortName.orElse(null));
...