
Show HN: Codemodder – Java 및 Python을 위한 새로운 codemod 라이브러리
요약
Codemodder는 Java와 Python을 위한 플러그형 codemod 프레임워크입니다. 정적 분석 도구를 활용한 높은 표현력과 코드 변경의 의도를 전달하는 스토리텔링 기능을 통해 안전하고 승인하기 쉬운 자동 코드 변경을 지원합니다.
핵심 포인트
- Java, Python, JavaScript 지원 플러그형 프레임워크
- 정적 분석 도구를 활용한 강력한 코드 식별 기능
- 코드 변경 의도를 명확히 전달하는 스토리텔링 기능 제공
- 보안 이슈 등 복잡한 코드 수정 자동화에 최적화
서론 (Introduction)
Codemodder는 표현력이 풍부한 codemod를 구축하기 위한 플러그형 프레임워크 (pluggable framework)입니다. 기존의 codemod 라이브러리들도 멋진 것들을 만들 수 있게 해주었지만, 더 표현력이 풍부하고 영향력 있는 코드 변경을 가능하게 하는 핵심 기능들이 모두 결여되어 있었습니다.
Codemodder는 다음과 같은 기능을 제공합니다:
최대의 표현력 (Maximum expressiveness). 여러분이 선호하는 화려한 정적 분석 (static analysis) 도구들을 사용하여 변경하고자 하는 코드를 식별할 수 있도록 합니다. 스토리텔링을 일급 기능 (first class feature)으로 제공. 팀 내 다른 개발자들에게 필요한 커뮤니케이션이 동반되지 않는 코드 변경 자동화는 그리 도움이 되지 않습니다. 가능한 한 가장 조용한 변경 (The quietest changes possible). "변경을 수행하는 것"과 "승인하기 쉬운 변경을 수행하는 것" 사이에는 어느 정도 거리가 있으며, 저희 프레임워크는 여러분이 후자를 향하도록 안내합니다.
여러분의 문제가 린터 (linter)가 탐지하고 수정할 수 있는 수준보다 한 단계 더 복잡하거나, 다루는 이슈가 직관적이지 않아(예: 고급 보안 이슈 등) 더 많거나 더 나은 스토리텔링이 필요한 경우 Codemodder는 선택하기 좋은 프레임워크입니다. 숙련된 개발자가 주니어 개발자에게 주는 피드백의 대부분이 이 범주에 속하지만, 저희는 쉬운 문제들도 해결할 수 있는 많은 오픈 소스 "핵심 codemods (core codemods)"를 제공합니다.
예시 (An example)
우리가 작성할 수 있는 가장 쉬운 codemod는 모든 보안에 취약한 (예측 가능한) 난수 생성 소스를 보안이 강화된 (예측 불가능한) 소스로 교체하는 것입니다. 여기서는 언어별로 해당 codemod가 어떤 모습일지 보여줍니다:
- Java
- Python
- JavaScript
/** {@link java.util.Random}을 {@link java.security.SecureRandom}으로 전환합니다. */
@Codemod(
id = "pixee:java/secure-random",
reviewGuidance = ReviewGuidance.MERGE_WITHOUT_REVIEW)
public final class SecureRandomCodemod extends SarifPluginJavaParserChanger<ObjectCreationExpr> {
private static final String DETECTION_RULE =
"""
rules:
- id: secure-random
pattern: new Random()
""";
@Inject
public SecureRandomCodemod(@SemgrepScan(yaml = DETECTION_RULE) RuleSarif sarif) {
super(sarif, ObjectCreationExpr.class);
}
@Override
public boolean onResultFound(
final CodemodInvocationContext context,
final CompilationUnit cu,
final ObjectCreationExpr objectCreationExpr,
final Result result) {
objectCreationExpr.setType("SecureRandom");
addImportIfMissing(cu, SecureRandom.class.getName());
return true;
}
}
이 코드는 GitHub에서 직접 확인할 수 있습니다.
고급 정적 분석 도구 (static analysis tool) 없이도 구현하기 쉬운 이 codemod는 Semgrep을 사용하여 java.util.Random에 대한 모든 생성자 호출을 찾습니다.
이것들이 바로 우리가 대신 SecureRandom으로 변경하고자 하는 위치들입니다.
그러면 codemodder 프레임워크는 Semgrep이 찾은 모든 위치를 onResultfound() 메서드로 전달하며, 여기서 코드는 단순히 타입을 변경하고 누락된 import를 추가하기만 하면 됩니다. 이 프레임워크는 정적 분석 도구의 실행, 결과 파싱, 결과를 처리하는 코드와 결과의 정렬, 결과 코드의 포맷팅 등 많은 번거로운 작업들을 대신 처리해 줍니다. 사용자는 변경할 코드를 찾는 방법과 어떤 변경을 원하는지만 지정하면 됩니다. 나머지는 저희가 처리합니다.
더 많은 실제 사례를 보려면, 프레임워크에 의해 유지 관리되고 일반적인 용도로 제작된 핵심 Java codemods를 확인해 보세요. 또한 전체 프로세스를 원활하게 만들기 위해 이러한 codemods를 구축하고 테스트하기 위한 유틸리티도 제공합니다.
class SecureRandom(SimpleCodemod):
metadata = Metadata(
name="secure-random",
review_guidance=ReviewGuidance.MERGE_AFTER_CURSORY_REVIEW,
summary="Secure Source of Randomness",
)
detector_pattern = """
-
patterns:
-
pattern: random.$F(...)
-
pattern-inside: |
import random
...
"""
def on_result_found(self, original_node, updated_node):
self.remove_unused_import(original_node)
self.add_needed_import("secrets")
return self.update_call_target(updated_node, "secrets.SystemRandom()")
이 코드는 GitHub에서 직접 확인할 수 있습니다.
이 codemod는 Semgrep을 사용하여 안전하지 않은 난수 메서드가 사용되는 사례를 탐지합니다. codemod 자체는 libCST 프레임워크를 사용하여 구현되었습니다.
더 많은 실제 사례를 확인하려면, 프레임워크에서 유지 관리하며 일반적인 용도로 제작된 핵심 Python codemods를 확인해 보세요. 또한 전체 프로세스를 원활하게 만들기 위해 codemods를 구축하고 테스트하는 데 필요한 유틸리티(utilities)도 제공합니다. 자세한 내용은 Python codemodder 리포지토리(repo)를 참조하세요.
⚠️ Python codemodder API는 아직 활발히 개발 중이며, 파괴적 변경(breaking changes)이 발생할 수 있습니다. ⚠️
곧 출시 예정!
Codemodder는 어떤 언어를 지원하나요?
- Java
- Python
- JavaScript (출시 예정)
AI 자동 생성 콘텐츠
본 콘텐츠는 HN OpenAI Codex의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기