Reino: Code Quality

Códigos de baixa qualidade levam a comportamentos imprevisíveis. Da perspectiva do usuário, isso normalmente se manifesta como usabilidade ruim. Para um invasor, trata-se de uma oportunidade para atacar o sistema de formas imprevistas.

Obsolete

Abstract
O uso de funções obsoletas ou preteridas pode indicar um código negligenciado.
Explanation
Em geral, conforme as linguagens de programação evoluem, métodos acabam se tornando obsoletos pelos seguintes motivos:

- Avanços na linguagem
- Melhor compreensão de como as operações devem ser realizadas com eficiência e
segurança
- Mudanças nas convenções que regulam determinadas operações

Instruções removidas de uma linguagem são geralmente substituídas por equivalentes mais atuais que realizam a mesma tarefa de maneira um pouco diferente e, quem sabe, ainda melhor.

Em particular, o SAP ABAP evoluiu a ponto de incluir Objetos ABAP (a extensão do ABAP orientada a objetos) e de operar em um ambiente compatível com Unicode. Como resultado, uma sintaxe mais rigorosa é imposta em classes ou em programas Unicode. Construções obsoletas ainda estão disponíveis somente por questões de compatibilidade com versões mais antigas e só podem ser usadas fora de classes ou em programas não Unicode. Existem construções substitutas para todos os elementos de linguagem obsoletos que melhoram a eficiência e capacidade de leitura de programas. Muitas especificações de tipo/comprimento/memória ambíguas implícitas na sintaxe obsoleta devem ser especificadas de forma mais precisa e explícita na sintaxe mais recente. Recomenda-se adotar a sintaxe mais recente para tornar os programas mais fáceis de entender, mais robustos e mais simples de manter.


Nem todas as funções são preteridas ou substituídas porque representam um risco de segurança. No entanto, a presença de uma função obsoleta muitas vezes indica que o código circundante foi negligenciado e pode estar em mau estado de conservação. Por muito tempo, a segurança dos softwares nunca foi uma prioridade ou sequer era levada em consideração. Se o programa usar funções preteridas ou obsoletas, ele aumentará a probabilidade de haver problemas de segurança à espreita nas proximidades.
desc.semantic.abap.obsolete
Abstract
O uso de funções obsoletas ou preteridas pode indicar um código negligenciado.
Explanation
Conforme as linguagens de programação evoluem, funções acabam se tornando obsoletas pelos seguintes motivos:

- Avanços na linguagem
- Melhor compreensão de como as operações devem ser realizadas com eficiência e
segurança
- Mudanças nas convenções que regulam determinadas operações


Funções removidas de uma linguagem são geralmente substituídas por equivalentes mais atuais que realizam a mesma tarefa de maneira um pouco diferente e, quem sabe, ainda melhor.
Exemplo: O código a seguir constrói um novo objeto SqlClientPermission que regula como os usuários podem se conectar a um banco de dados. Neste exemplo, o programa transmite false como o segundo parâmetro para o construtor, que controla se os usuários têm permissão para se conectarem com senhas em branco. A transmissão de "false" para esse parâmetro indica que senhas em branco não devem ser permitidas.


...
SCP = new SqlClientPermission(pstate, false);
...


No entanto, como o objeto PermissionState transmitido como o primeiro parâmetro substitui qualquer valor transmitido ao segundo parâmetro, o construtor permite senhas em branco para conexões de banco de dados, o que contradiz o segundo argumento. Para proibir senhas em branco, o programa deve transmitir PermissionState.None ao primeiro parâmetro do construtor. Devido à ambiguidade na sua funcionalidade, a versão de dois parâmetros do construtor SqlClientPermission foi preterida a favor da versão de parâmetro único, que transmite o mesmo grau de informações sem o risco de má interpretação.

Nem todas as funções são preteridas ou substituídas porque representam um risco de segurança. No entanto, a presença de uma função obsoleta muitas vezes indica que o código circundante foi negligenciado e pode estar em mau estado de conservação. Por muito tempo, a segurança dos softwares nunca foi uma prioridade ou sequer era levada em consideração. Se o programa usar funções preteridas ou obsoletas, ele aumentará a probabilidade de haver problemas de segurança à espreita nas proximidades.
desc.semantic.dotnet.obsolete
Abstract
O uso de funções obsoletas ou preteridas pode indicar um código negligenciado.
Explanation
Conforme as linguagens de programação evoluem, funções acabam se tornando obsoletas pelos seguintes motivos:

- Avanços na linguagem.
- Melhor compreensão de como as operações devem ser realizadas de forma eficaz e segura.
- Alterações nas convenções que regem certas operações.

Funções removidas são geralmente substituídas por equivalentes mais atuais que realizam a mesma tarefa de maneira um pouco diferente e, quem sabe, ainda melhor.
Exemplo: O código a seguir usa a função preterida getpw() para verificar se a senha de texto sem formatação corresponde à senha criptografada de um usuário. Se a senha for válida, a função definirá result como 1; caso contrário, ele será definida como 0.


...
getpw(uid, pwdline);
for (i=0; i<3; i++){
cryptpw=strtok(pwdline, ":");
pwdline=0;
}
result = strcmp(crypt(plainpw,cryptpw), cryptpw) == 0;
...


Embora o código muitas vezes se comporte corretamente, usar a função getpw() pode ser uma estratégia problemática sob o ponto de vista da segurança, pois pode estourar o buffer transmitido para seu segundo parâmetro. Devido a essa vulnerabilidade, getpw() foi suplantado por getpwuid(), que executa a mesma pesquisa que getpw(), mas retorna um ponteiro para uma estrutura estaticamente alocada a fim de atenuar o risco.

Nem todas as funções são preteridas ou substituídas porque representam um risco de segurança. No entanto, a presença de uma função obsoleta muitas vezes indica que o código circundante foi negligenciado e pode estar em mau estado de conservação. Por muito tempo, a segurança dos softwares nunca foi uma prioridade ou sequer era levada em consideração. Se o programa usar funções preteridas ou obsoletas, ele aumentará a probabilidade de haver problemas de segurança à espreita nas proximidades.
desc.semantic.cpp.obsolete
Abstract
O uso de funções obsoletas ou preteridas pode indicar um código negligenciado ou o uso de uma versão antiquada do ColdFusion.
Explanation
Conforme as linguagens de programação evoluem, métodos acabam se tornando obsoletos pelos seguintes motivos:

- Avanços na linguagem
- Melhor compreensão de como as operações devem ser realizadas com eficiência e
segurança
- Mudanças nas convenções que regulam certas operações

Métodos removidos de uma linguagem são geralmente substituídos por equivalentes mais atuais que realizam a mesma tarefa de maneira um pouco diferente e, quem sabe, ainda melhor.


Nem todas as funções são preteridas ou substituídas porque representam um risco de segurança. No entanto, a presença de uma função obsoleta muitas vezes indica que o código circundante foi negligenciado e pode estar em mau estado de conservação. Por muito tempo, a segurança dos softwares nunca foi uma prioridade ou sequer era levada em consideração. Se o programa usar funções preteridas ou obsoletas, ele aumentará a probabilidade de haver problemas de segurança à espreita nas proximidades.
desc.semantic.cfml.obsolete
Abstract
O uso de funções obsoletas ou preteridas pode indicar um código negligenciado.
Explanation
Conforme as linguagens de programação evoluem, métodos acabam se tornando obsoletos pelos seguintes motivos:

- Avanços na linguagem
- Melhor compreensão de como as operações devem ser realizadas com eficiência e
segurança
- Mudanças nas convenções que regulam certas operações

Métodos removidos de uma linguagem são geralmente substituídos por equivalentes mais atuais que realizam a mesma tarefa de maneira um pouco diferente e, quem sabe, ainda melhor.
Exemplo: O código a seguir constrói um objeto de string a partir de um array de bytes e um valor que especifica os primeiros 8 bits de cada caractere Unicode de 16 bits.


...
String name = new String(nameBytes, highByte);
...


Neste exemplo, o construtor pode falhar ao converter corretamente bytes em caracteres, dependendo de qual conjunto de caracteres é usado para codificar a string representada por nameBytes. Devido à evolução dos charsets utilizados para codificar strings, este construtor foi descontinuado e substituído por um construtor que aceita como um de seus parâmetros o nome do charset usado para codificar os bytes para conversão.

Nem todas as funções são preteridas ou substituídas porque representam um risco de segurança. No entanto, a presença de uma função obsoleta muitas vezes indica que o código circundante foi negligenciado e pode estar em mau estado de conservação. Por muito tempo, a segurança dos softwares nunca foi uma prioridade ou sequer era levada em consideração. Se o programa usar funções preteridas ou obsoletas, ele aumentará a probabilidade de haver problemas de segurança à espreita nas proximidades.
References
[1] MET02-J. Do not use deprecated or obsolete classes or methods CERT
desc.semantic.java.obsolete
Abstract
O uso de funções obsoletas ou preteridas pode indicar um código negligenciado.
Explanation
Conforme as linguagens de programação evoluem, métodos acabam se tornando obsoletos pelos seguintes motivos:

- Avanços na linguagem
- Uma melhor compreensão de como as operações deveriam ser realizadas de maneira efetiva e
segura
- Mudanças nas convenções que regulam certas operações.

Métodos removidos de uma linguagem são geralmente substituídos por equivalentes mais atuais que realizam a mesma tarefa de maneira um pouco diferente e, quem sabe, ainda melhor.
Exemplo: Este código usa a stdlib Digest::HMAC, cujo uso é explicitamente desencorajado na documentação devido ao envolvimento acidental em uma versão.


require 'digest/hmac'

hmac = Digest::HMAC.new("foo", Digest::RMD160)
...
hmac.update(buf)
...


Neste exemplo, a classe Digest::HMAC foi preterida imediatamente após o envolvimento devido à inclusão acidental em uma versão. Devido à possibilidade de ela não funcionar como o esperado por causa de um código experimental e não testado apropriadamente, a utilização é extremamente desencorajada, especialmente considerando-se a relação que os HMACs têm com a funcionalidade criptográfica.

Nem todas as funções são preteridas ou substituídas porque representam um risco de segurança. No entanto, a presença de uma função obsoleta muitas vezes indica que o código circundante foi negligenciado e pode estar em mau estado de conservação. Por muito tempo, a segurança dos softwares nunca foi uma prioridade ou sequer era levada em consideração. Se o programa usar funções preteridas ou obsoletas, ele aumentará a probabilidade de haver problemas de segurança à espreita nas proximidades.
desc.structural.ruby.obsolete
Abstract
Uma função obsoleta é usada.
Explanation
Devido à natureza acelerada dos contratos inteligentes, funções e operadores podem se tornar obsoletos com versões mais recentes do compilador e usá-los pode levar a código de baixa qualidade, efeitos colaterais não intencionais e/ou erros de compilação.

Exemplo 1: O código a seguir obtém o hash do bloco atual usando block.blockhash(), que está obsoleto desde a versão 0.5.0 do compilador Solidity.


bytes32 blockhash = block.blockhash(0);
desc.structural.solidity.swc111