Park, Geon (re-st)

정의 사용 그래프를 빨리 만드는 방법

[essay] 2 min read

Abstract

정적분석을 활용한 정의-사용 그래프 생성 과정의 속도를 개선하기 위해 세 가지 방향으로 탐구를 진행하고 있다. 이는 실행 불가 코드 제거, 포인터 집합의 크기 관리, 그리고 부하가 큰 함수 발견 및 처리로, 이 과정에서 사람의 개입을 없애는 것까지가 연구의 목표이다.

본문

우리 연구실의 지향성 퍼징 기술인 DAFL과 Topuzz는 목표 지점으로 이어지는 데이터 흐름을 활용하여 좋은 성과를 내고 있으며, 이를 위해 필수적인 작업이 정적 분석을 통한 정의-사용 그래프의 생성이다. 그러나 Topuzz에서는 각 목표 지점별로 그래프를 생성해야 하므로 큰 시간 부하에 직면했다.

이를 빠르게 하기 위해 다음과 같은 방향을 도전 중이다. 첫째로, 퍼징 대상인 고정된 명령 옵션에서 실행 가능성이 없는 코드 지점을 지운다. 우리는 벤치마크 프로그램을 면밀히 읽고 그러한 지점을 직접 분류하여 속도가 크게 향상되는 것을 확인했다. 정적 분석기가 해당 지점을 무시하는 것은 이미 구현되었으며, 앞으로는 이런 지점을 자동으로 선정하는 것이 큰 과제이다. 컴파일러의 상수 전파를 넘어 사용자 설정값을 활용하여 코드를 더 고정시키는 코드 디블로팅 연구1 등을 참고할 수 있다.

둘째로, 불확실한 경로를 모은 포인터 집합의 크기를 관리한다. 변수에 함수나 변수 포인터를 저장하고 넘겨받아 실행하는 코드를 정적 분석하면 그게 가지고 있을 수 있는 포인터의 집합이 나오는데, 이가 클수록 정적 분석의 탐색 시간이 늘어난다. 포인터 집합의 크기를 제한해본 결과 일부 벤치마크에서 성능 개선을 확인했다. 이는 속도 외적으로 중요한 과제 두 가지를 더 만드는데, 강제조정이 부정확성을 높이는지 파악하는 것과, 분석이 무한 루프에 빠지지 않도록 포인터 집합을 잘 관리하는 것이다.

셋째로, 실행 경로 파악을 어렵게 하는 함수들을 식별하여 다른 곳에 흡수시키거나 제거한다. 이런 함수는 여러 부모 함수에서 호출되고 여러 자식 함수를 호출하여 정적 분석이 파악하는 실행 경로를 섞어놓고, 따라서 분석의 탐색 시간을 늘린다. 현재 직접 코드를 읽거나 정적 분석 결과의 포인터 집합 크기를 분석하여 그런 함수를 추측하는 단계에 있으며, 이러한 함수들을 다른 함수에 흡수시거나, 정의-사용 관계에 큰 영향을 주지 않는다면 건너뛰도록 해 실행 경로 혼선을 막는 걸 수동으로 시연해 볼 예정이다.

코드 중 정적 분석 그래프 제작에 시간 부하를 주는 부분을 식별하고 이를 처리하는 과정을 자동화하는 것이 목표이다. 이는 여러 면에서 이점이 있다. 첫째, 정의-사용 그래프를 적극 활용하는 우리 연구실에 적합한 연구이다. 둘째, 우리만큼 정의-사용 그래프를 많이 사용하는 연구실은 드물기 때문에 이 연구는 매우 새로운 시도이다. 또한, 이 연구는 정적 분석 연구이면서 정의-사용 그래프를 매개로 코드 자동 수정, 퍼징 등 다른 연구와 결합되는 다각적 연구의 기반이 되어 다양한 방향으로 확장할 수 있다. 예를 들어, Topuzz에서는 정의-사용 그래프의 일부 정보만 활용하므로, 이를 유지하는 한에서 정적 분석을 더욱 간략화할 수도 있을 것이다.



  1. Aatira Anum Ahmad and et al.. “Trimmer: An Automated System for Configuration-Based Software Debloating” ↩︎

#Essay  #Weekly-Writing 

<< Previous Post

|

Next Post >>

← 뒤로