界: Code Quality

コードの質が低いと、予測できない動作につながります。ユーザーの視点には、それがしばしば使い勝手の悪さとなって現れます。攻撃者にとっては、予期せぬ方法でシステムにストレスを与える機会となります。

Obsolete

Abstract
廃止予定あるいは廃止済みの関数が使用されていることは、無視されているコードがあることを示している場合があります。
Explanation
一般に、プログラミング言語の進化に伴い、以下の理由でメソッドが廃止されることがあります。

- 言語の進歩
- 操作の効率的で安全な実行方法に関する
理解の向上
- 特定の操作について定めた規則の変更

ある言語から削除されたステートメントは通常、より優れていると思われる別の方法で同じタスクを実行する新しい関数に置き換えられます。

特に、SAP ABAP は、ABAP Objects (ABAP のオブジェクト指向の拡張機能) を含み、Unicode 互換環境で動作するように発展したものです。その結果、クラスまたは Unicode プログラムでより厳密な構文が強制されます。古いリリースとの互換性のためだけに廃止済みのコンストラクトを現在でも使用でき、クラス外または Unicode 以外のプログラムでのみ使用できます。廃止済みのすべての言語要素のために代替コンストラクトがあり、プログラムの効率と読みやすさが向上します。廃止済みの構文内の暗黙的であいまいな多数のタイプ/長さ/メモリ仕様を、より正確で明示的な方法で新しい構文に指定する必要があります。プログラムをわかりやく、より堅牢で保守しやすくするために、新しい構文を採用することをお勧めします。


すべての関数がセキュリティリスクを招くという理由で廃止されたり、置き換えられたりするわけではありません。しかし多くの場合、廃止された関数があることは、その周辺のコードが無視されており、メンテナンスされていない状態であることを示します。ソフトウェアセキュリティは長い間、優先事項どころか検討事項ですらありませんでした。廃止予定または廃止済みの関数がプログラムで使用されていると、その周辺にセキュリティ上の問題がある可能性が浮上します。
desc.semantic.abap.obsolete
Abstract
廃止予定あるいは廃止済みの関数が使用されていることは、無視されているコードがあることを示している場合があります。
Explanation
プログラミング言語の進化に伴い、以下の理由で関数が廃止されることがあります。

- 言語の進歩
- 操作の効率的で安全な実行方法に関する
理解の向上
- 特定の操作について定めた規則の変更


ある言語から削除された関数は通常、より優れていると思われる別の方法で同じタスクを実行する新しい関数に置き換えられます。
例: 次のコードは、データベースへのユーザーの接続許可方法を規制する、新しい SqlClientPermission オブジェクトを構成します。この例のプログラムは、ユーザーがパスワードを空欄にして接続できるかどうかを制御するコンストラクタに false を 2 番目のパラメーターとして渡しています。このパスワードに False を渡すと、空欄のパスワードは許容されなくなります。


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


ただし、最初のパラメーターとして渡される PermissionState オブジェクトが 2 番目のパラメーターとして渡されるあらゆる値より優先されるため、コンストラクタはパスワードを空欄にしてデータベースに接続することを許容し、2 番目の引数に反する事態が発生します。空欄のパスワードを拒否するには、プログラムがコンストラクタの最初のパラメーターに PermissionState.None を渡すようにします。誤った解釈を生む危険がなく同じ情報を伝達できる単一パラメーターのバージョンに比べた場合、このような機能的なあいまいさが存在しているため、パラメーターを 2 つ取るバージョンの SqlClientPermission コンストラクタの仕様は現在の状況には適当でないものとなっています。

すべての関数がセキュリティリスクを招くという理由で廃止されたり、置き換えられたりするわけではありません。しかし多くの場合、廃止された関数があることは、その周辺のコードが無視されており、メンテナンスされていない状態であることを示します。ソフトウェアセキュリティは長い間、優先事項どころか検討事項ですらありませんでした。廃止予定または廃止済みの関数がプログラムで使用されていると、その周辺にセキュリティ上の問題がある可能性が浮上します。
desc.semantic.dotnet.obsolete
Abstract
廃止予定あるいは廃止済みの関数が使用されていることは、無視されているコードがあることを示している場合があります。
Explanation
プログラミング言語の進化に伴い、以下の理由で関数が廃止されることがあります。

- 言語の進歩
- 操作の効率的で安全な実行方法に関する理解の向上
- 特定の操作について定めた規則の変更

削除された関数は通常、より優れていると思われる別の方法で同じタスクを実行する新しい関数に置き換えられます。
例: 次のコードは、旧式の関数 getpw() を使用して平文のパスワードが、暗号化されたユーザーパスワードと一致するかどうかを検証しています。パスワードが有効であれば、関数は result を 1 に、それ以外の場合は 0 にします。


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


コードが正しく動作していても、セキュリティの面から getpw() 関数が問題になることがあります。これは、2 つ目のパラメーターに渡されたバッファがオーバーフローするためです。この脆弱性のために、getpw() は、getpw() と同じルックアップを実行しても、静的に割り当てられた構造体にポインタを戻す (リスクを緩和するため) getpwuid() に置き換えられてきました。

すべての関数がセキュリティリスクを招くという理由で廃止されたり、置き換えられたりするわけではありません。しかし多くの場合、廃止された関数があることは、その周辺のコードが無視されており、メンテナンスされていない状態であることを示します。ソフトウェアセキュリティは長い間、優先事項どころか検討事項ですらありませんでした。廃止予定または廃止済みの関数がプログラムで使用されていると、その周辺にセキュリティ上の問題がある可能性が浮上します。
desc.semantic.cpp.obsolete
Abstract
廃止予定または廃止済みの関数が使用されていることは、無視されているコードまたは ColdFusion の古いバージョンが使用されていることを示しています。
Explanation
プログラミング言語の進化に伴い、以下の理由でメソッドが廃止されることがあります。

- 言語の進歩
- 操作の効率的で安全な実行方法に関する
理解の向上
- 特定の操作について定めた規則の変更

ある言語から削除されたメソッドは通常、より優れていると思われる別の方法で同じタスクを実行する新しいメソッドに置き換えられます。


すべての関数がセキュリティリスクを招くという理由で廃止されたり、置き換えられたりするわけではありません。しかし多くの場合、廃止された関数があることは、その周辺のコードが無視されており、メンテナンスされていない状態であることを示します。ソフトウェアセキュリティは長い間、優先事項どころか検討事項ですらありませんでした。廃止予定または廃止済みの関数がプログラムで使用されていると、その周辺にセキュリティ上の問題がある可能性が浮上します。
desc.semantic.cfml.obsolete
Abstract
廃止予定あるいは廃止済みの関数が使用されていることは、無視されているコードがあることを示している場合があります。
Explanation
プログラミング言語の進化に伴い、以下の理由でメソッドが廃止されることがあります。

- 言語の進歩
- 操作の効率的で安全な実行方法に関する
理解の向上
- 特定の操作について定めた規則の変更

ある言語から削除されたメソッドは通常、より優れていると思われる別の方法で同じタスクを実行する新しいメソッドに置き換えられます。
例: 次のコードは、各 16 ビット Unicode 文字の最初の 8 ビットを指定する値とバイトの配列からストリングオブジェクトを構築します。


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


この例では、nameBytes で表される文字列のエンコードにどの文字セットが使用されているかによって、コンストラクターがバイトを文字に正しく変換できない可能性があります。文字列のエンコードに使用される文字セットの進化により、このコンストラクターは非推奨となり、パラメーターの 1 つとして、変換のためにバイトをエンコードするために使用される、charset という名前のパラメーターを受け入れるコンストラクターに置き換えられました。

すべての関数がセキュリティリスクを招くという理由で廃止されたり、置き換えられたりするわけではありません。しかし多くの場合、廃止された関数があることは、その周辺のコードが無視されており、メンテナンスされていない状態であることを示します。ソフトウェアセキュリティは長い間、優先事項どころか検討事項ですらありませんでした。廃止予定または廃止済みの関数がプログラムで使用されていると、その周辺にセキュリティ上の問題がある可能性が浮上します。
References
[1] MET02-J. Do not use deprecated or obsolete classes or methods CERT
desc.semantic.java.obsolete
Abstract
廃止予定あるいは廃止済みの関数が使用されていることは、無視されているコードがあることを示している場合があります。
Explanation
プログラミング言語の進化に伴い、以下の理由でメソッドが廃止されることがあります。

- 言語の進歩
- 操作の効率的で安全な実行方法に関する
理解の向上
- 特定の操作について定めた規則の変更

ある言語から削除されたメソッドは通常、より優れていると思われる別の方法で同じタスクを実行する新しいメソッドに置き換えられます。
例: 次のコードは Digest::HMAC stdlib を使用しています。これはリリース内に誤って含まれたために、ドキュメントで明示的に使用を禁止しています。


require 'digest/hmac'

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


この例の Digest::HMAC クラスは、リリース内に誤って含まれたため、追加直後に廃止されています。実験的で適切にテストされていないコードであり、期待どおりに動作しない可能性があるため、特に HMAC の暗号化機能に関する関係を考慮すると、この使用を避けることを強くお勧めします。

すべての関数がセキュリティリスクを招くという理由で廃止されたり、置き換えられたりするわけではありません。しかし多くの場合、廃止された関数があることは、その周辺のコードが無視されており、メンテナンスされていない状態であることを示します。ソフトウェアセキュリティは長い間、優先事項どころか検討事項ですらありませんでした。廃止予定または廃止済みの関数がプログラムで使用されていると、その周辺にセキュリティ上の問題がある可能性が浮上します。
desc.structural.ruby.obsolete
Abstract
非推奨の関数が使用されています。
Explanation
スマート コントラクトは進化のペースが速いため、新しいコンパイラー バージョンでは関数や演算子が非推奨になる可能性があり、それらを使用するとコードの品質が低下したり、意図しない副作用やコンパイル エラーが発生したりする可能性があります。

例 1: 次のコードは、block.blockhash() を使用して現在のブロックのハッシュを取得します。これは、Solidity コンパイラーのバージョン 0.5.0 以降非推奨になりました。


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