Findbugs

Findbugs?

  • Java 프로그램에서 발생할 수 있는 버그를 감지하는 오픈소스 정적 코드 분석기.
  • 정적 코드 분석기 : 프로그램 실행 없이 바이트코드를 분석하여 문제를 발견한다.
  • Eclipse, NetBeans, IntelliJ, Gradle, Hudson, Maven, Bamboo, Jenkins 용 플러그인이 있다.

식별하는 오류(문제)의 종류

Null 포인터, 자원 누수, 경합 상태 등의 다양한 문제를 탐지할 수 있다.

오류(문제) 설명
NullPointerException 관련  
Null Dereference Null 값이 들어갈 가능성이 있는 객체를 참조하려고 할 때 발생하는 오류. 이 오류는 실제 실행 중 NullPointerException을 유발할 수 있기 때문에 코드의 안정성을 떨어뜨린다.
Possible Null Dereference 조건에 따라 특정 경로에서 NullPointerException이 발생할 가능성이 있는 경우. 모든 코드 경로를 분석하여 Null 가능성을 검사한다.
리소스 누수 관련  
Unclosed Resource 파일, 네트워크 연결, 데이터베이스 연결 등의 리소스가 사용 후에 닫히지 않는 경우 발생하는 오류. 리소스를 닫지 않으면 메모리 누수나 시스템 자원 낭비를 초래할 수 있다.
Potential Resource Leak 특정 조건에서만 리소스가 닫히지 않을 가능성이 있는 경우 탐지한다. try-finally 블록에서 리소스를 적절히 닫지 않을 경우 발생할 수 있다.
보안 문제  
SQL Injection 사용자가 입력한 데이터가 검증 없이 SQL 쿼리에 포함될 경우 발생하는 문제. 이를 통해 악의적인 사용자가 데이터베이스를 침해할 수 있다.
Hardcoded Password 코드에 하드코딩된 비밀번호가 포함되어 있는 경우 발생. 이는 보안에 심각한 위협을 가할 수 있으며, 보안 규칙에 어긋난다.
스레드 동기화 문제  
Deadlock 두 개 이상의 스레드가 서로 락을 획득하려고 하다가 영원히 대기 상태에 빠지는 문제. FindBugs는 코드에서 상호 대기 조건을 탐지하여 잠재적인 교착 상태를 경고한다.
Synchronization on Non-final Field 동기화되지 않은 객체나 값이 여러 스레드에서 동시에 접근될 수 있는 경우, Race Condition이 발생할 가능성이 크다. 이러한 필드에 대한 동기화가 필요함을 경고한다.
그 외 - 불필요하거나 위험한 코드 사용 : 사용되지 않은 변수, 호출될 가능성이 없는 메서드
- 잘못된 API 사용 : API가 요구하는 인수 타입과 일치 여부
- 예외 처리가 필요한 부분에서 예외 처리가 되었는지 여부
- 성능 문제 : 문자열 연결 연산이나 불필요한 래핑 과정을 탐지해서 성능 최적화를 권고
- 타입 오류 : 데이터 타입 간 잘못된 형변환 탐지, 불필요한 형변환 탐지

식별되는 문제의 심각성 단계

잠재적 오류 단계 단계 이름 단계 설명
scariest 최고 심각 가장 심각한 단계로, 코드 실행 중 치명적인 오류를 유발할 가능성이 매우 높다. NullPointerException, 리소스 누수, 교착 상태(Deadlock) 등과 같이 프로그램의 중단이나 주요 기능의 실패를 유발할 수 있는 오류들이 여기에 속한다.
scary 심각 심각한 오류로 분류되며, 반드시 해결해야 할 문제들이다. 코드 동작에 직접적인 문제를 일으킬 가능성은 높지 않지만, 장기적으로 코드의 품질이나 안정성을 저하시킬 수 있다. 이러한 문제는 프로그램의 성능이나 유지보수성에도 영향을 미칠 수 있다.
troubling 문제 가능성 있음 프로그램의 동작에 직접적인 문제를 일으키지는 않지만, 코드가 오작동할 여지를 남기는 오류들이다. 특정 상황에서만 문제를 유발하거나, 잘못된 코드 작성 관행으로 인해 코드의 가독성이나 효율성을 떨어뜨릴 수 있는 오류들이 여기에 속한다.
of concern 주의 요망 비교적 심각성이 낮은 문제로, 프로그램에 직접적인 문제를 일으키지 않을 가능성이 높지만, 코드 품질에 있어 개선이 필요한 부분들. 코드의 가독성이나 유지보수성을 높이기 위해 확인하고 수정하는 것이 좋다.

이클립스 FindBugs 플러그인을 이용한 문제점 탐지

플러그인 설치

이클립스 실행 > Help > Eclipse Marketplace



findbugs 검색 > Install > 설치 완료 후 Installed 확인



이클립스 재시작

FindBugs 실행 준비

이클립스 > Windows > Show View > Other



FindBugs > Bug Explorer 선택 후 OK 클릭



하단 창에 Bug Explorer 뷰가 추가됨을 확인


FindBugs 실행

소스폴더 우클릭하여 컨텍스트 메뉴 > Find Bugs > Find Bugs 클릭



Bug Explorer 뷰에서 식별된 버그 목록 출력됨



식별된 버그 전부 픽스 후에는 다시 Source > Find Bugs > Find Bugs를 하면 조치 결과를 확인할 수 있습니다. (모두 조치되었다면 아무런 결과도 안나오고, 미조치 사항은 출력됨)



Reference

Wikipedia - FindBugs
Eclipse Plugin - FindBugs
Hompage - FindBugs