GN⁺: 어떤 언어에서도 사용할 수 있는 C-Reduce 기술
(bernsteinbear.com)-
C-Reduce의 활용
- C-Reduce는 Regehr와 그의 동료들이 개발한 도구로, C 컴파일러 버그 재현기를 최소화하는 데 사용됨.
- 예를 들어, Clang 버그를 유발하는 10,000줄의 C 파일을 줄이고 싶을 때 유용함.
- C-Reduce는 C 언어에만 국한되지 않고 다양한 언어에 적용 가능함.
-
C-Reduce의 요구 사항
- 결정론적 조건 필요.
- 빠른 재현기가 있으면 감소 속도에 도움을 줌.
- C-Reduce가 줄일 수 있는 하나 이상의 변경 가능한 소스 파일 필요.
-
RustPython 버그 사례
- RustPython에서 발생한 버그를 보고하기 위해 스크립트
interesting.sh
작성. - 스크립트는 RustPython 실행 후 특정 오류 메시지를 grep으로 찾음.
- RustPython에서 발생한 버그를 보고하기 위해 스크립트
-
C-Reduce 실행
- C-Reduce를 실행하여 파일 크기를 50% 이상 줄이는 데 성공.
-
--not-c
옵션을 사용하여 C에 특화된 패스를 피하고 Python에 맞게 최적화함. - 결과적으로 빠르고 쉽게 파일을 줄일 수 있었음.
-
결론
- C-Reduce는 다양한 언어에 적용 가능하며, 빠르고 효율적으로 파일을 줄이는 데 유용함.
- 오픈 소스 블로그로, 오류가 있으면 변경 제안 가능함.
Hacker News 의견
-
한 사용자는 파일을 줄이는 방법을 공유하고, RustPython과 scrapscript를 사용하여 설정하는 방법을 설명함
-
git clone
명령어를 사용하여 RustPython과 scrapscript를 클론하고,cargo build --release
로 빌드함 -
interesting.sh
파일을 다운로드하고 실행 권한을 부여함 -
nix run nixpkgs#creduce
명령어를 사용하여 파일을 줄임
-
-
C-Reduce의 사용을 추천하며, Shrinkray라는 도구도 함께 사용해볼 것을 권장함
- Shrinkray는 포맷에 독립적이며 C-Reduce가 잘 작동하지 않는 경우에도 유용함
-
C-Reduce에 대한 논문이 2012년에 발표되었음을 언급함
- John Regehr et al.의 논문을 통해 C-Reduce의 작동 방식을 설명함
-
C-Reduce를 처음 알게 되었고, git bisect를 처음 발견했을 때와 같은 흥미로움을 느낌
- 나중에 필요할 때 사용하기 위해 기억해 두기로 함
-
C-Reduce의 예시를 보여주는 기사를 발견했으나, 각 반복에서 무엇을 제거할지 결정하는 방법에 대한 이해가 어려움
- 토큰화 과정이 있을 것으로 추측되지만, 프로그래밍 언어 간에 어떻게 작동하는지 이해하기 어려움
-
C-Reduce가 매우 유용하다고 평가함
- CSmith를 사용하여 무작위 테스트 프로그램을 생성하고, 충돌 시 자동으로 C-Reduce를 사용하여 문제를 줄임
-
델타 디버깅은 새로운 개념이 아님
- "delta"라는 델타 디버깅 구현은 19년 이상 되었으며, 오픈 소스로 공개됨
- LLVM 소개에서는 표준 델타 디버깅 도구로 언급됨
-
SQL에서도 잘 작동하며, 직장에서 사용 중임
- SQLancer를 통해 발견함
-
C 언어 외의 언어에서도 작동하는 이유에 대한 설명이 없으면 믿기 어려움
- LLM을 사용하지 않기 때문에 더욱 혼란스러움
-
C-Reduce의 좋은 후속 도구로 cvise를 추천함
- 어셈블리 프로그램을 최소한의 집합으로 줄이는 데 여러 번 사용했으며, 매우 유용한 프로그램임