코드 유사성 분석 도구의 함수 추상화 단계가 사실상 동일한 함수를 일관되게 식별하지 못하던 결함을, 원인 규명부터 내용 기반 해시 명명 로직 도입까지 해결
겉으로는 코드 유사성 분석 정확도 문제처럼 보였지만 파고들어 보니 같은 함수가 매번 같은 이름을 얻지 못하는 식별자 문제가 컸습니다. 이런 버그는 결과만 보면 우연처럼 보여서 원인까지 가는 데 시간이 걸립니다.
다언어 테스트로 재현 조건을 좁히고 함수 내용 기반 해시로 바꾼 이유는, 분석 결과가 다시 실행해도 흔들리지 않게 만들기 위해서였습니다.
코드 레벨 보안 분석 도구는 소스 코드를 함수 단위로 추상화(정규화)한 뒤 함수 시그니처를 비교해 유사 코드와 취약점을 탐지합니다. 그런데 이 추상화 단계에서 변수명·타입만 다를 뿐 사실상 동일한 함수가 매번 다른 시그니처로 생성되는 문제가 있었습니다.
여러 언어의 소스로 재현 테스트를 수행해 원인을 좁혔습니다. 결과적으로 두 가지 결함이 확인됐습니다.
final, Map<> 같은 특정 키워드·제네릭 문법을 제대로 처리하지 못함핵심 해결책으로, 익명 함수가 매번 다른 이름으로 처리되는 문제에는 함수 내용 기반 해시값으로 고유하고 일관된 함수명을 부여하도록 명명 로직을 개발·적용했습니다. 같은 내용이면 항상 같은 이름이 나오므로 동일 함수가 일관되게 식별됩니다.
먼저 같은 함수에서 시그니처가 달라지는 조건을 재현하고 언어별 테스트 케이스를 늘렸습니다. 원인은 구문 분석기와 hash-gen 정규식에 나뉘어 있었고, JavaScript 익명 함수는 함수 내용으로 만든 해시를 이름으로 사용하도록 고쳤습니다.
코드 유사성·취약점 분석 파이프라인의 정밀도 개선 작업의 일부로 진행.