この記事は、インテル® デベロッパー・ゾーンに公開されている「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/) を見てみましょう。これらのエラーの半分は、コピー & ペーストが原因です。
コードをコピーして編集する場合は、面倒がらずに編集後のコードを必ず確認しましょう。
コピー & ペーストについては後で詳しく取り上げます。この問題は、実際には見かけよりも根深いものなので、皆さん忘れないでください。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。