JD-GUI bug, it dropped explicit casts

최근에, framework 을 수정할 일이 있었는데, 큰 문제를 일으킬뻔 한 jd-gui 버그가 있어 글로 정리..

1. 시스템이 여러개라 메인시스템을 제외하고 framework library 의 소스가 따로 관리되지 않고 있었음.

2. framework 의 개선이 있어서 작업을 하고 메인시스템 외의 시스템은

decompile 해서 해당 함수 수정하고 다시 compile 해서 jar로 생성 후 반영

위와 같은 작업을 하고 있었는데 decompiler 로 jd-gui를 사용했다. jar 전체를 java 소스로 뽑아주는 기능이 있었기 때문이다.

전체 소스를 비교하면서 작업을 꼼꼼히 하기 위해서 사용했었는데..

문제는 이것.

원 소스 :

public class TestClass {

	public int ceil(int a, int b) {
		return (int) Math.ceil((double)a/(double)b);
	}
}

jd-gui가 de-compile 한 java (BUG!)


public class TestClass
{
  public int ceil(int a, int b)
  {
    return (int)Math.ceil(a/b);
  }
}

jad.exe가 de-compile 한 java


public class TestClass
{

    public TestClass()
    {
    }

    public int ceil(int a, int b)
    {
        return (int)Math.ceil((double)a / (double)b);
    }
}

jd-gui가 명시적 casting을 날려먹음..

결과.. 2, 100 이 파라미터로 넘어가면..

원함수는 1을 리턴했으나, jd-gui를 믿었다면 0을 리턴하게 되므로 로직이 변경됨..

주의하세요 !