계: Code Quality
코드 품질이 낮으면 예측할 수 없는 동작이 발생합니다. 사용자 입장에서는 사용 편의성이 떨어지는 것으로 나타나는 경우가 많습니다. 공격자에게는 예상치 못한 방법으로 시스템에 부담을 줄 수 있는 기회가 됩니다.
Code Correctness: Hidden Method
Abstract
정적 메서드는 재정의할 수는 없지만, 인스턴스 메서드로 호출하는 경우 숨겨진 것으로 표시될 수 있습니다.
Explanation
정적 메서드는 클래스의 인스턴스가 아닌 클래스 자체에 속하므로 원칙적으로 오버라이드할 수 없습니다. 정적 메서드가 하위 클래스에서 오버라이드된 것처럼 표시되는 경우도 있는데, 이로 인해 혼동을 하여 잘못된 메서드 버전을 호출하게 될 수도 있습니다.
예제 1: 다음 코드는 사용자 인증을 위한 API를 정의합니다.
이 코드는 처음 보기에는 아무 문제가 없는 것 같습니다. 그러나
예제 1: 다음 코드는 사용자 인증을 위한 API를 정의합니다.
class AccessLevel{
public static final int ROOT = 0;
//...
public static final int NONE = 9;
}
//...
class User {
private static int access;
public User(){
access = AccessLevel.ROOT;
}
public static int getAccessLevel(){
return access;
}
//...
}
class RegularUser extends User {
private static int access;
public RegularUser(){
access = AccessLevel.NONE;
}
public static int getAccessLevel(){
return access;
}
public static void escalatePrivilege(){
access = AccessLevel.ROOT;
}
//...
}
//...
class SecureArea {
//...
public static void doRestrictedOperation(User user){
if (user instanceof RegularUser){
if (user.getAccessLevel() == AccessLevel.ROOT){
System.out.println("doing a privileged operation");
}else{
throw new RuntimeException();
}
}
}
}
이 코드는 처음 보기에는 아무 문제가 없는 것 같습니다. 그러나
User
또는 RegularUser
클래스가 아닌 user
인스턴스에 대해 getAccessLevel()
메서드를 호출하므로 이 조건에서는 항상 true
가 반환됩니다. 그리고 이 if/else
블록 부분으로 진입하기 위해 instanceof
를 사용했더라도 제한된 작업이 수행됩니다.References
desc.structural.java.code_correctness_hidden_method