プログラミング、リファクタリング、そしてすべてにおける究極の疑問: No. 3

その他インテル® DPC++/C++ コンパイラー特集

この記事は、インテル® デベロッパー・ゾーンに公開されている「The Ultimate Question of Programming, Refactoring, and Everything」の日本語参考訳です。


3. コピーは 1 回、チェックは 2 回

Audacity プロジェクトから抜粋した以下のコードについて考えてみます。このエラーは、次の PVS-Studio 診断によって検出されます。

V501 There are identical sub-expressions to the left and to the right of the ‘-‘ operator. (V501 ‘-‘ 演算子の左側と右側に同じ部分式があります。)

sampleCount VoiceKey::OnBackward (....) {
  ...
  int atrend = sgn(buffer[samplesleft - 2]-
                   buffer[samplesleft - 1]);                          
  int ztrend = sgn(buffer[samplesleft - WindowSizeInt-2]-
                   buffer[samplesleft - WindowSizeInt-2]);
  ...
}

説明

減数と被減数がともに “buffer[samplesleft – WindowSizeInt-2]” です。これは、コードブロックのコピーに関連したミスと考えられます (コピー & ペースト (英語))。プログラマーは、コードをコピーした後に 2 を 1 に変更するのを忘れてしまったようです。

これはよくあるエラーですが、ミスです。このようなエラーは、プログラマーにとって厳しい現実と言えます。そのため、この記事では繰り返し取り上げています。私は、このエラーの撲滅を宣言しています。

正しいコード

int ztrend = sgn(buffer[samplesleft - WindowSizeInt-2]-
                 buffer[samplesleft - WindowSizeInt-1]);

推奨事項

コードの複製は慎重に行う必要があります。

コピー & ペーストを全面的に否定することはできません。このように便利で役立つエディター機能を使わない手はありません。

ただし、注意深く慎重に行う必要があります。つまり、転ばぬ先の杖です。

コードのコピーは、多くのエラーを引き起こす可能性があることに注意してください。V501 診断で検出されるエラーの例 (http://www.viva64.com/en/examples/V501/) を見てみましょう。これらのエラーの半分は、コピー & ペーストが原因です。

コードをコピーして編集する場合は、面倒がらずに編集後のコードを必ず確認しましょう。

コピー & ペーストについては後で詳しく取り上げます。この問題は、実際には見かけよりも根深いものなので、皆さん忘れないでください。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました