2009-12-05 6 views
2

Java 바이트 코드 엔지니어링 라이브러리 ASM을 사용하여 정적 분석을 수행하려고합니다. 필드에 할당 된 변수를 검사하고 싶은 상황이 있습니다.ASM 방문자를 사용하여 스택을 검사하는 방법은 무엇입니까?

나는 visitFieldInsn() 메서드를 구현하는 MethodVisitor입니다. 나는 특별히 putfield 명령을 찾고있다. 그것은 아무런 문제가되지 않습니다. 문제는 내가 putfield을 만날 때 필드에 할당 될 변수에 액세스 할 수 있기를 원합니다. 특히 변수의 유형에 대한 정보에 액세스하려고합니다.

현재로서는 스택의 맨 위에있는 것을보아야하지만 더 일반적인 방법으로 검사하는 것이 더 좋습니다.

ASM을 사용하여 스택의 변수를 검사하는 방법이 있습니까?

답변

5

우선 바이트 코드가 유효하다고 가정 할 수있는 필드에 할당 된 값 유형은 ClassReader API를 사용하여 미리 읽을 수있는 필드 유형과 일치해야합니다.

그러나 주어진 명령어 포인터에 대한 스택 또는 변수 슬롯의 각 개별 값이 어디에서 왔는지 추적해야하는 경우 Analyzer API를 SourceInterpreter와 함께 사용할 수 있습니다. 기본적으로 주어진 값을 생성 한 명령어를 찾을 수 있으며, 해당 명령어에 대한 정보를 사용하여 유형을 추론 할 수 있습니다 (예 : 메소드 매개 변수에 해당하는 변수에서 값을 읽거나 메소드 호출에서 값이 반환 된 경우) 메소드 설명자에서 유형을 얻을 수있는 경우). 또한 example of using SourceInterpreter이있는 나의 오래된 블로그 포스트를보십시오.

+0

링크를 사용하는 예가 매우 좋습니다. 감사합니다. – Grundlefleck

0

ASM에 익숙하지 않지만 Eclipse Java AST 프레임 워크와 비슷한 것으로 들었습니다. 변수에 대해 알고 싶으면 AST 방문자의 적절한 visitX() 메소드에서 직접 변수 선언을 추적해야했습니다. 일단 어떤 AST 노드가 변수 선언에 해당하는지 알았 더라면 그리 어렵지 않았습니다.

관련 문제