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.
Often Misused: Boolean.getBoolean()
Boolean.getBoolean()
é muitas vezes confundido com chamadas de métodos Boolean.valueOf()
ou Boolean.parseBoolean()
.Boolean.getBoolean()
é muitas vezes má utilizada, pois presume-se que ela retorne o valor booliano representado pelo argumento de string especificado. No entanto, conforme indicado no Javadoc, o método Boolean.getBoolean(String)
"retornará true se, e somente se, a propriedade do sistema nomeada pelo argumento existir e for igual à string 'true'".Na maioria das vezes, o que o desenvolvedor pretendia usar era uma chamada para o método
Boolean.valueOf(String)
ou Boolean.parseBoolean(String)
.Exemplo 1: O código a seguir não se comportará conforme esperado. Ele imprimirá "FALSE", pois
Boolean.getBoolean(String)
não converte uma primitiva de String. Ele apenas converte a propriedade do sistema.
...
String isValid = "true";
if ( Boolean.getBoolean(isValid) ) {
System.out.println("TRUE");
}
else {
System.out.println("FALSE");
}
...