2017-11-15 19 views
1

FindBugs는 다음과 같은 설명과 함께 EI_EXPOSE_REP라는 버그를 제기 배열에 의한 EI_EXPOSE_REP라는 버그를 제기 객체의 필드 중 하나에 저장된 값은 객체의 내부 표현을 나타냅니다. 인스턴스가 신뢰할 수없는 코드에 의해 액세스되고 변경 가능한 객체에 대한 검사되지 않은 변경으로 보안 또는 기타 중요한 속성이 손상 될 경우 다른 작업을 수행해야합니다. 많은 경우에 객체의 새로운 복사본을 반환하는 것이 더 나은 방법입니다. FindBugs는

class Person { 
    private String[] hobbies; 
    String[] getHobbies(){ return hobbies;} 
    void setHobbies(String[] hobbies){ this.hobbies = hobbies;} 
} 

나는 몇 가지 솔루션을 알고 대신 배열의
  • 사용 목록

    1. getHobbies() {반환 hobbies.clone을()};

    제가 알고 싶은 것은 단지 배열이이 버그를 제기하는 이유입니다. 목록에이 문제가 없습니까? 배열이 다른 컬렉션과 다른 이유는 무엇입니까?

  • +1

    목록이 변경 가능하기 때문에 목록에 대해 동일한 경고를받지 못하는 이유가 확실하지 않습니다. – alfasin

    답변

    2

    Findbugs (현재 Spotbugs로 대체 됨)는 보안 문제를 야기합니다. 버그 자체가 원하지 않는 동작을 생성하지 않기 때문에 버그가 아닙니다. 그러나 내부 데이터를 노출하면 나중에 호출자 메소드에서 버그가 발생할 수 있습니다.

    • 반환 Arrays.copyOf(..)
    • 와 배열의 복사본이 Collections.unmodifiableList(..)
    와 함께 "불변"목록에 변환 :

    당신은 노출에 대한 귀하의 게터를 보호하기 위해 두 가지 방법이 있습니다, 그것을 짐작

    List은 수정이 불가능한 경우가 아니면 유사한 경고를 표시합니다. 실제로는 좋은 이유가없는 한 Arrays 대신 Collections을 사용하는 것이 좋습니다. 당신은 몇 쓰기를 가지고 많은 사람들이 읽고 어떤 경우에는


    는, 클래스 CopyOnWriteArrayList 간단한 불변의리스트 게터을 할 수있는 좋은 대안이다. 단지 배열이 버그를 제기 이유를 알고 싶은 무엇


    이다.
    경고 일뿐입니다. Findbugs는 보고서 옆에 심각도 수준을 표시합니다.
    노출은 보안을위한 중간 정도이지만 버그는 적습니다.

    목록에이 문제가 있습니까?
    있습니다. ArrayList는 추가 추상화 레이어가있는 배열입니다.

    왜 배열이 다른 컬렉션과 다른가요?
    배열은 네이티브 형식이며 컬렉션은 그렇지 않습니다.
    동작은 비슷하지만 컬렉션에 비해 Array에 대한 제어 권한이 적습니다.

    +0

    'private string [] 취미를'개인 목록 hobbies '로 변경하면 버그가 발생하지 않는 것을 발견하고 테스트합니다. 나는 이유를 모른다. –

    +1

    옵션에서 Findbugs 민감도를 높이십시오. 어쩌면 최대 수준의 경고가 아닐 수도 있습니다. –

    +1

    감사합니다. 매우 도움이되었습니다. 버그를 찾기위한 새로운 분석 도구 인 Spotbugs를 알고 있습니다. 권자 –