Symbolic Execution
코드를 테스팅 하기 위해서는 특정한 분기의 라인을 실행하는 입력을 주어야 한다. 특정 분기의 코드가 실행되기 위해 어떤 입력값을 주어야 할까? Symbolic Execution을 통해 특정한 코드라인을 실행하기 위한 조건을 알 수 있다.
Symbolic Execution은 입력값으로 변수에 어떠한 값을 주는 대신 기호를 주어 프로그램을 실행한다. 중등수학에서 배웠던 미지수 x 라고 생각하면 이해가 쉽다.
1: void func(int A){
2: int ret =0;
3: if (A ==1)
4: ret = 100;
5: else if (A ==2)
6: ret ==200;
7: else
8: ret = -1;
9: }
변수에 기호를 주고 테스팅 한 결과로 (ret = 100 and a=1), (ret = 200 and a =2), (ret = -1 and (a != 1 and a != 2) 가 나오게 된다.
그림 1 은 Symbolic execution tree이다. 이제 이 트리를 통해 내가 테스트 하고 싶은 라인을 실행하기 위한 조건을 조합할 수 있게 된다.
프로그램의 모든 실행 경우의 수를 테스트할 수 없기 때문에 효율적인 방법으로 테스팅하는 것이 중요한데 Symbolic execution은 특정 라인의 실행 조건에 대한 정보를 수집할 수 있기 때문에 테스팅에 중요한 정보를 제공해준다.