classwriter (compute_max + compute_stack)가 설정되어 있어도 MaxStack을 올바르게 계산하지 않음 ASM (ObjectWeb)
-
19-09-2019 - |
문제
ASM을 사용하여 생성 한 클래스를로드하려고 할 때 ClassVerifyErrors가 예상됩니다. 추가 검사에서 JVM이 정확하고 메소드에 대해 이야기하고 있음을 알 수 있습니다. 이상한 점은 자동 계산 스택 및 최대 로컬 옵션을 사용하는 것입니다. 따라서 문제가되지 않아야합니다 ... 유효하지 않은 옵션이있는 방법은 매우 간단하지만 결과는 바이트 코드가 잘못되었습니다.
의도 된 방법을 가진 클래스를 작성했으며 ASM 생성 클래스를 Javac 생성과 BYTE 코드 매치업과 비교하여 Max 스택 인 유일한 오류는 0 인 반면 Javac은 값을 설정합니다.
이드는 그 tha Max 스택/현지인을 직접 계산하지 않아도됩니다.
해결책
바이트 코드가 유효하지 않은 경우 최대 스택 및 가변 계산은 잘못된 결과를 생성 할 수 있습니다. 생성 된 코드 트로프를 실행하여 CheckClassAdapter.
예를 들어,
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
// generate code into cw instance...
PrintWriter pw = new PrintWriter(System.out);
CheckClassAdapter.verify(new ClassReader(cw.toByteArray()), true, pw);
제휴하지 않습니다 StackOverflow