[Software Testing] Runtime error check 와 Static analysis
[질문] Static analysis 를 수행하면 'runtime error check를 충분히 수행한다' 라고 말할 수 있을까?
이를 대답하기 위해서는 runtime error 의 종류는 어떤 것들이 있는지 알아야 한다.
Runtime error 는 다음과 같은 것들이 있다.
1. NULL pointer 참조
- NULL 값으로 초기화되지 않은 포인터를 참조하려고 할 때 발생.
- 이 경우, 이상한 메모리 위치에 access을 하게 되며, 프로그램이 이상하게 동작할 수 있음.
2. Array index out of bounds
- 변수가 자신의 최대값을 초과하여 overflow 발생하는 경우
- overflow 발생하면 예상하지 못한 값을 가지거나 부호가 바뀌는 등의 문제 발생 가능
3. Division by zero
- 어떤 값을 0으로 나누면 발생
- 비정상적인 종료가 발생할 수 있음.
4. Memory leak
- 동적으로 할당된 메모리를 해제하지 않고 계속 사용하는 경우 발생.
- 쓰지 않는 메모리가 계속 커지게 되어서, 사용 가능한 메모리가 없어지게 됨.
5. Synchronization issue
- Parallel processing SW인 경우, 공유 자원에 대한 동시 접근이나 동기화 문제가 발생해 예상치 못한 결과 발생 가능.
6. Buffer overrun
- 할당 버퍼 boundary 를 초과해 데이터 read/write 수행하여 의도치 않은 문제 발생 가능
7. File access error
- 런타임 라이브러리 함수를 잘못 사용하거나 잘못된 매개변수로 호출하는 경우 발생.
8. 기타 등등
Static analysis는 프로그램의 소스코드나 binary 코드의 구조, 변수 사용, 함수 호출 등을 분석해서 코드의 잠재적인 문제나 오류를 식별하는 분석 방법이다. 즉, 프로그램을 실행하지 않고 코드만 가지고 분석한다.
이 방법으로 'NULL pointer 참조', 'Array index out of bounds', 명시적인 'Division by zero' 등을 검출할 수 있다.
하지만, 'Memory leak', 'synchronization issue', 'buffer overrun' 등과 같이 프로그램을 실행해야만 분석이 가능한 사항들은 검출하기가 어렵다.
[답변] Static analysis 는 일부 'runtime error' case (e.g. Null pointer 참조, Array index out of bounds' 등) 은 검출 가능하나, 프로그램을 수행하면서 확인 가능한 'run time error' case (e.g. memory leak, synchronization issue' 등) 은 검출이 어렵다. 그러므로, code sonar 등의 runtime error checking tool 을 사용할 필요가 있다.