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

同カテゴリーの次の記事

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

この記事は、インテル® デベロッパー・ゾーンに公開されている「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 診断で検出されるエラーの例 (英語) を見てみましょう。これらのエラーの半分は、コピー & ペーストが原因です。

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

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

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

関連記事

  • Parallel Universe マガジンParallel Universe マガジン Parallel Universe へようこそ。 米国インテル社が四半期に一度オンラインで公開しているオンラインマガジンです。インテルの技術者によるテクノロジーの解説や、最新ツールの紹介など、並列化に関する記事を毎号掲載しています。第1号からのバックナンバーを PDF 形式で用意しました、ぜひご覧ください。 12 […]
  • 比較関数の罠比較関数の罠 この記事は、インテル® デベロッパー・ゾーンに公開されている「The Evil within the Comparison Functions」の日本語参考訳です。 この記事の PDF […]
  • インテル® IPP サンプル – エラーの修正インテル® IPP サンプル – エラーの修正 この記事は、インテル® ソフトウェア・ネットワークに掲載されている「Intel IPP Samples for Windows - error correction」の日本語参考訳です。 この記事は、PVS-Studio を使用することでプログラムがどのように安全になるかを説明した記事の 1 […]
  • 並列プログラミングにおけるロックの効率的な使用並列プログラミングにおけるロックの効率的な使用 この記事は、インテル® ソフトウェア・ネットワークに掲載されている「Using Locks Effectively in Parallel Programming […]
  • ファクトシート: oneAPIファクトシート: oneAPI この記事は、インテル ニュースルームに公開されている「Fact Sheet: oneAPI」の日本語参考訳です。 この記事の PDF 版はこちらからご利用になれます。 oneAPI とは? oneAPI […]