Uma API é um contrato entre quem chama e o que se chama. As formas mais comuns de abuso de API ocorrem quando o responsável pela chamada não respeita sua parte do contrato. Por exemplo, se um programa não chama chdir() após chamar chroot(), ele viola o contrato que especifica como alterar o diretório raiz ativo de forma segura. Outro bom exemplo de abuso de biblioteca é esperar que o elemento chamado retorne informações confiáveis de DNS ao responsável pela chamada. Nesse caso, o responsável pela chamada abusa a API do elemento chamado ao fazer certas suposições sobre seu comportamento (isto é, que o valor de retorno pode ser usado para fins de autenticação). A outra parte também pode violar o contrato entre quem chama e o que se chama. Por exemplo, se um programador definir SecureRandom como subclasse e retornar um valor não aleatório, o contrato será violado.
Code Correctness: Class Does Not Implement Equivalence Method
Equals()
é chamado em um objeto que não implementa Equals()
.Equals()
em uma classe (ou qualquer superclasse/interface) que não implemente Equals()
explicitamente resulta em uma chamada para o método Equals()
herdada de System.Object
. Em vez de comparar campos membros de objetos ou outras propriedades, o Object.Equals()
compara duas instâncias de objeto para ver se elas são iguais. Embora existam usos legítimos de Object.Equals()
, muitas vezes isso é uma indicação de um código com bug.Exemplo 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
}
}
equals()
é chamado em um objeto que não implementa equals()
.equals()
em uma classe (ou qualquer superclasse/interface) que não implemente equals()
explicitamente resulta em uma chamada para o método equals()
herdada de java.lang.Object
. Em vez de comparar campos membros de objetos ou outras propriedades, o Object.equals()
compara duas instâncias de objeto para ver se elas são iguais. Embora existam usos legítimos de Object.equals()
, muitas vezes isso é uma indicação de um código com bug.Exemplo 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
}
}