•
1 min read
Mutation可能的问题

因为类型是Mutation的,所以reference和copy就有了区别。如果是reference,那么可能会暴露数据本身,遭到恶意修改,引发安全的问题。下面是一段Java代码,其中有一个 Mutation引起的的bug:

class ProtectedResource {
    private Resource theResource = ...;
    private String[] allowedUsers = ...;    
    public String[] getAllowedUsers() {
        return allowedUsers;
    }
    public String currentUser() {...}
    public void useTheResource() {
        for (String allowedUser : allowedUsers) {
            if (currentUser().equals(allowdUser)) {
                ... // access allowed: use it
                return;
            }
        }
        throw new IllegalAccessException();
    }
}

以上代码的bug发生在getAllowedUsers。因为返回的是对于allowedUsers的引用,那么就可以对数据进行修改,如下:

p.getAllowedUsers()[0] = p.currentUser;
p.useTheResource();

修改方法就是返回一个copy,但也要注意是否需要deep copy:

public String[] getAllowedUsers() {
    ... 
    return a copy of allowedUsers;
}

本文是 Programming Languages by UW 笔记的一部分。 Java Mutation