界: API Abuse

API 就像是呼叫者與被呼叫者之間簽訂的規定。最常見的 API 濫用形式是由呼叫者這一當事方未能遵守此規定所造成的。例如,如果程式在呼叫 chroot() 後無法呼叫 chdir(),即違反規範如何以安全方式變更使用中根目錄的規定。程式庫濫用的另一個好例子是期待被呼叫者向呼叫者傳回值得信賴的 DNS 資訊。在這種情況下,呼叫者是透過對其行為做出某些假設 (傳回值可用於驗證目的) 來濫用被呼叫者 API。另一方也可能違反呼叫者與被呼叫者間的規定。例如,如果編碼器衍生出子類別 SecureRandom 並傳回一個非隨機值,則違反了規定。

Object Model Violation: Erroneous clone() Method

Abstract
clone() 方法應呼叫 super.clone() 來取得新的物件。
Explanation
所有對 clone() 方法的執行中,都應透過呼叫 super.clone() 來取得新物件。如果某個類別無法遵守這個慣例,那麼子類別的 clone() 方法將會回傳錯誤的物件類型。


範例 1:以下兩個類別顯示了由於沒有呼叫 super.clone() 而產生的錯誤。由於類別的 Kibitzer 執行 clone() 方法,FancyKibitzer 類別的複製方法將會回傳 Kibitzer 類型的物件,而非 FancyKibitzer 類型。


public class Kibitzer implements Cloneable {
public Object clone() throws CloneNotSupportedException {
Object returnMe = new Kibitzer();
...
}
}

public class FancyKibitzer extends Kibitzer
implements Cloneable {
public Object clone() throws CloneNotSupportedException {
Object returnMe = super.clone();
...
}
}
References
[1] Standards Mapping - Common Weakness Enumeration CWE ID 580
desc.structural.java.object_model_violation_erroneous_clone_method