[아이템8] finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수도 있다.

2024. 7. 1. 17:07BOOKS/이펙티브 자바

finalizer는 정적 필드에 자신의 참조를 할당하여 가비지 컬렉터가 수집하지 못하게 막을 수 있다.

public class Zombie {
	static Zombie zombie;

	public void finalize() {
		zombie = this;
	}
}

객체 생성을 막으려면 생성자에서 예외를 던지는 것만으로 충분하지만 finalizer 있다면 그렇지도 않다.

public class Zombie2 {
    static Zombie2 zombie;
    int value;
    
    public Zombie2(int value) {
        if(value < 0) {
            throw new IllegalArgumentException("Negative Zombie2 value");
        }
        this.value = value;
    }
    
    public void finalize() {
        zombie = this;
    }
}

vlaue 값에 대한 유효성 검사가 있지만 finalizer로 인해 무효화