soot.main.main (...)을 호출하지 않고 그을음 분석을 사용할 수 있습니까?
-
13-12-2019 - |
문제
나는 그을음 자바 프로그램의 정적 분석을 수행하도록 예를 들어,제어 흐름 그래프.
다양한 자습서 그을음을 사용하는 "표준 방법"이사용자 정의 변환을 그을음 파이프 라인 다음 soot.main.main (...) :
public static void main(String[] args) {
PackManager.v().getPack("jtp").add(
new Transform("jtp.gotoinstrumenter", GotoInstrumenter.v()));
soot.Main.main(args);
}
.
물론 명령 줄 도구보다 다른 수영장을 사용하려면 이렇게하면 심각한 제한이 있습니다.예를 들어, 프로그램에서 Soot의 주요 방법을 한 번 이상 콜을 위해 합법적인지 여부는 불분명합니다.
누구도 조금 더 정교한 API를 통해 그을음 분석 도구를 직접 사용할 수있는 가능성을 알고 있습니까?
해결책
대답은 예입니다.귀하의 주요에서 귀하가 작업하는 클래스를 설정할 수 있습니다 :
configure("../yourClasspath/");
SootClass sootClass = Scene.v().loadClassAndSupport("className");
sootClass.setApplicationClass();
// Retrieve the method and its body
SootMethod m = c.getMethodByName("methodName");
Body b = m.retrieveActiveBody();
// Instruments bytecode
new YourTransform().transform(b);
.
다음에 CFG를 만들고 일부 분석을 실행할 수 있습니다.
구성 방법은 다음과 같습니다.
public static void configure(String classpath) {
Options.v().set_verbose(false);
Options.v().set_keep_line_number(true);
Options.v().set_src_prec(Options.src_prec_class);
Options.v().set_soot_classpath(classpath);
Options.v().set_prepend_classpath(true);
PhaseOptions.v().setPhaseOption("bb", "off");
PhaseOptions.v().setPhaseOption("tag.ln", "on");
PhaseOptions.v().setPhaseOption("jj.a", "on");
PhaseOptions.v().setPhaseOption("jj.ule", "on");
Options.v().set_whole_program(true);
}
. 제휴하지 않습니다 StackOverflow