2016-02-26 4 views
1

Я уверен, что получаю ложный результат от FindBugs. Мой код выглядит следующим образом:Ложноположительная ошибка MS_PKGPROTECT в FindBugs

public class MyClass { 
    protected static String fileNamePrefix; 
}   

И это ошибка я получаю:

поля должно быть пакет защищен

Изменяемого статическое поле может быть изменена вредоносным кодом или авария. Поле может быть защищено пакетом, чтобы избежать этой уязвимости.

Bug вид и модель: MS - MS_PKGPROTECT

Является ли это на самом деле ложный положительный или я что-то не хватает?

ответ

1

Защищенный модификатор позволяет стороннему подклассу получить повышенный доступ к полю.

class MyEvilSubClass extends MyClass { 
    static { 
     fileNamePrefix = "../" + fileNamePrefix; 
    } 
} 

FindBugs указывает, что «защищенный» не защищает поле от открытого доступа в дикой природе. Если поле было защищено пакетом, мы знаем, что намерение состоит в том, чтобы разделить какой-то секрет среди доверенных друзей.

В целом, спрячьте поле и создайте методы доступа, поскольку он более гибкий с точки зрения инкапсуляции, безопасности потоков и ленивой загрузки.

+0

Ничего себе не видел, чтобы кто-то пришел ... так что создание геттера и сеттера для поля - это правильный путь, верно? должны ли эти два метода быть защищенными или публичными? – randombee

+0

@randombee Право. Те же правила применяются к полю применительно к статическому методу. Разница с методом заключается в том, что вы можете проверить вызывающего абонента с чем-то вроде менеджера безопасности. Если это общедоступные данные, сделайте их общедоступными. Если это какой-то секрет среди ваших классов, тогда сделайте его доступ по умолчанию. – jmehrens

+0

Одно примечание к описанию FindBugs. Хотя поле может быть изменено «случайно», исправление, безусловно, не предотвратит вредоносный код. Я могу создать свой пакет в том же пространстве пакета, например. org.apache.http.MyClass и доступ к флагом. И если это не сработало, всегда есть отражение. – dzlatkov