Search Results for '정적 검사'

2 POSTS

  1. 2006.10.08 Static Checker for Python: PyChecker
  2. 2006.10.05 JSR305 1

Static Checker for Python: PyChecker

Posted 2006. 10. 8. 11:48
파이썬을 위한 정적 검사(static analysis) 도구를 찾아 보다 PyChecker 프로젝트를 발견했다. PyChecker는 C의 lint와 유사한 프로그램으로 파이썬 프로그램을 읽어서 실행 전에 다음 오류들을 알려준다.

- 사용된 전역 변수가 정의되지 않았을 때. (예를 들어 import 없이 모듈을 사용)
- 함수/메쏘드/생성자에 넘기는 인자 수가 맞지 않을 때.
- 내부(builtin) 함수/메쏘드에 넘기는 인자 수가 맞지 않을 때.

- 포맷 문자열과 인자가 맞지 않을 때.

- 존재하지 않는 메쏘드나 속성(attribute)을 사용했을 때.

- 메쏘드를 오버라이드할 때 시그너처를 바꾼 경우.

- 같은 스코프에서 함수/클래스/메쏘드를 재정의했을 때.

- 변수를 초기화 없이 사용했을 때.

- 메쏘드의 첫 번째 인자가 self가 아닐 때.

- 사용되지 않은 전역 변수와 지역 변수.

- 사용되지 않은 함수/메쏘드 인자.

- 모듈, 클래스, 함수, 메쏘드에 doc이 없을 때.


사실 이 정도 검사는 별도의 어노테이션 없이 가능한데, 왜 파이썬 인터프리트가 직접 지원하지 않는지는 잘 모르겠다. 저런 뻔한 버그 때문에 몇 번이나 코드를 테스트해야 한다는 것은 엄청난 약점일 것 같은데 말이다.

참고 문서
1. Regular Expressions: Syntax Checking the Scripting Way by Cameron Laird and Kathryn Soraiz
http://www.unixreview.com/documents/s=2426/uni1018986621203/0204h.htm

JSR305

Posted 2006. 10. 5. 16:02
Jsr-305 -- Annotations for Software Defect Detection란 글에서 소프트웨어 버그 탐지 도구를 위한 표준 어노테이션을 제정하는 JSR 305에 대한 간략한 소개를 한 바 있다. 초안(first draft)이 11월에 나오기로 되어 있기 때문에 아직 자세한 내용을 알 수는 없지만, JSR 홈페이지에 가보면 몇 가지 예제를 볼 수 있다.

Nullness annotations (e.g., @NonNull and @CheckForNull). Both FindBugs and IntelliJ already support their own versions of nullness annotations.


일단 FindBugs가 "David Hovemeyer, Jaime Spacco, and William Pugh. Evaluating and Tuning aStatic Analysis to Find Null Pointer Bugs, Proceedings of the 2005 ACM SIGPLAN-SIGSOFTWorkshop on Program Analysis for Software Tools and Engineering (PASTE 2005),Lisbon, Portugal, September, 2005." 논문에서 소개한 어노테이션으로 @NonNull, @CheckForNull 등이 있다. 메쏘드의 인자에 @NonNull의 어노테이션이 붙어있다면 해당 인자는 절대 null이 되지 않으므로 null 검사 없이 사용이 가능하다. 반대로 @CheckForNull이면, null이 될 수도 있는 인자이므로 반드시 null 검사를 한 후에 사용해야 한다. 이런 정보를 모아서 정적 검사 도구는 프로그램을 실행시켜 보기도 전에 '널 포인터 오류'가 발생할 것인지를 어느 정도 찾아낼 수 있게 된다.

Check return value annotation - an annotation that says ignoring the return value of a method is likely incorrect (e.g., String.toLowerCase())

또 하나의 활용 처는 리턴 값을 반드시 체크해야 하는지 여부를 어노테이션으로 표시하는 것이다. JSR에서 예를 든 것처럼 String.toLowerCase() 함수를 살펴보자. 자바의 String은 immutable 클래스이다. 따라서 toLowerCase() 메쏘드를 호출하면 해당 객체의 문자열을 소문자로 치환하는 것이 아니라 소문자로 치환된 새로운 문자열을 리턴해준다. 이 메쏘드를 호출하면서 리턴 값을 무시했다면 무엇인가 잘못 생각했음이 틀림 없다. String.toLowserCase()에 리턴 값을 반드시 체크하라는 어노테이션이 있다면, 결함 검사 도구가 오류를 자동으로 찾아낼 수 있을 것이다.

그 외에도 Taint, Concurrency 등 여러 가지 이슈에 대한 어노테이션을 생각 중이라고 한다. 이런 어노테이션 표준화로 얻을 수 있는 장점은 한 번 코드를 어노테이션 해놓으면 여러 검사 도구를 이용해서 다양한 버그를 자동으로 검출할 수 있다는 점이다. 현재는 FindBugs를 비롯한 개별 검사 도구가 각자 다른 어노테이션을 요구하므로, 검사 도구를 수행하기 위한 오버헤드가 상당하기 때문이다.

[참고자료]
1. JSR 305: Annotations for Software Defect Detection
2. Artima: Annotations for Java Software Defect Detection