カット&ペーストでバグが起きる?

By 神居 - Posted: 2011/02/16 Last updated: 2011/02/16 - Leave a Comment

プログラムをコーディングする際に、複数行のリピートやカット&ペーストなどで、すでにコーディング済みのロジックを複製してその内容の一部を変えて使うような場合があります。

SUBRTN1  DS    0H                             +----------+
         :                                              I
         :                                              I ここをコピーして
         LTR   R1,R1            CHECK INPUT PARAMETER    I
         BNZ   SUBRTN1B         IF NOT ZERO...           I
         :                                              I
         :                                   +----------+

         ┃
         ┃
         ▼

SUBRTN2  DS    0H  <-- ラベル名は重複する     +----------+
         :            とエラーになるのですぐ気づく      I
         :                                              I 貼り付ける
         LTR   R1,R1            CHECK INPUT PARAMETER    I
         BNZ   SUBRTN1B         IF NOT ZERO...           I
         :    ~~~~~~~~ 直し忘れやすい                   I
         :                                   +----------+

本来なら似たようなロジックの内部サブルーチンなどは、処理内容を整理して1つにまとめるなどをした方がいいのですが、既存のソースに機能を追加するような場合、今まで動いていた部分になるべく手を付けないようにしたい、ということはよくあることです。そのためコピーして内容の一部を少し変えて使う、ということはありがちです。この時ラベル名などは重複すれば当然アセンブラーがエラーにするのでわかりますし、そもそもペーストした時点で最初に直すような箇所です。しかしロジック内の分岐命令の飛び先などは、十分に注意しないと直し忘れやすい部分です。参照先は新規に書いた名前ではないのでアセンブル時にエラーにはなりません。
この例のように新たに作った内部サブルーチンSUBRTN2を呼んだとき、ルーチン内に条件分岐命令があってその条件に一致するような場合、コピー元のラベル名のアドレスへ飛んで行ってしまいます。その後実行結果がおかしかったりABENDしたりした場合、その原因が意外とわかりにくかったりします。
複数行のブロック・リピートやカット&ペーストは便利でコーディングの生産性を上げますが、似たようなロジックを安易に複製するとこういうことも起きる、と意識しておくといいでしょう。

Posted in MVS実践アセンブラー・プログラミング • • Top Of Page