界: API Abuse
API 是调用方和被调用方之间的约定。最常见的 API 滥用是由于调用方未能遵守此约定的终止导致的。例如,如果某个程序在调用 chroot() 后未能调用 chdir(),则违反了用于指定如何安全地更改活动根目录的约定。库滥用的另一个典型示例是期望被调用方向调用方返回可信的 DNS 信息。在这种情况下,调用方通过对被调用方行为做出某种假设(返回值可用于身份验证目的)滥用其 API。另一方也可能违反调用方-被调用方约定。例如,如果编码器子类化 SecureRandom 并返回一个非随机值,则将违反此约定。
Code Correctness: Class Does Not Implement Equivalence Method
Abstract
在没有实现
Equals()
的对象上调用了 Equals()
。Explanation
当比较对象时,开发人员通常希望比较对象的属性。然而,在没有明确实现
示例 1:
Equals()
的类(或任何超类/接口)上调用 Equals()
会导致调用继承自 System.Object
的 Equals()
方法。Object.Equals()
将比较两个对象实例,查看它们是否相同,而不是比较对象成员字段或其他属性。尽管可以合法地使用 Object.Equals()
,但这通常表示存在错误代码。示例 1:
public class AccountGroup
{
private int gid;
public int Gid
{
get { return gid; }
set { gid = value; }
}
}
...
public class CompareGroup
{
public bool compareGroups(AccountGroup group1, AccountGroup group2)
{
return group1.Equals(group2); //Equals() is not implemented in AccountGroup
}
}
References
[1] Standards Mapping - Common Weakness Enumeration CWE ID 398
desc.structural.dotnet.code_correctness_class_does_not_implement_equals
Abstract
在没有实现
equals()
的对象上调用了 equals()
方法。Explanation
当比较对象时,开发人员通常希望比较对象的属性。然而,在没有明确实现
例 1:
equals()
的类(或任何超类/接口)上调用 equals()
会导致调用继承自 java.lang.Object
的 equals()
方法。Object.equals()
将比较两个对象实例,查看它们是否相同,而不是比较对象成员字段或其他属性。尽管可以合法地使用 Object.equals()
,但这通常表示存在错误代码。例 1:
public class AccountGroup
{
private int gid;
public int getGid()
{
return gid;
}
public void setGid(int newGid)
{
gid = newGid;
}
}
...
public class CompareGroup
{
public boolean compareGroups(AccountGroup group1, AccountGroup group2)
{
return group1.equals(group2); //equals() is not implemented in AccountGroup
}
}
References
[1] Standards Mapping - Common Weakness Enumeration CWE ID 398
desc.structural.java.code_correctness_class_does_not_implement_equals