バグ検出ドリル(5)「小さな親切、大きなお世話」な問題山浦恒央の“くみこみ”な話(105)(3/3 ページ)

» 2018年04月12日 10時00分 公開
前のページへ 1|2|3       

4.解答

 解答は、「問題文の文字コード表が間違っており、正しい値を表示できない」です。リスト2-1リスト2-2をご覧ください。

  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00                                
10                                
20   ! " # $ % & ( ) * + , - . /
30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
40 @ A B C D E F G H I J K L M N O
50 P Q R S T U V W X Y Z [ \ ] ^ _
60 ' a b c d e f g h i J K l m n
70 o p q r s T u v w x y Z { | } ~
リスト2-1 文字コード表(リスト1-2の再掲で、バグがある)

  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00                                
10                                
20   ! " # $ % & ( ) * + , - . /
30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
40 @ A B C D E F G H I J K L M N O
50 P Q R S T U V W X Y Z [ \ ] ^ _
60 ' a b c d E f g h i j K L m n o
70 p q r s t U v w x y z { | } ~  
リスト2-2 正しい文字コード表

 リスト2-1は、問題で示した間違った文字コード表で、リスト2-2が正しい文字コード表です。この問題で、筆者はわざと文字コード表の0161に本当であれば「a」と書くところに「\(バックスラッシュ)」を仕込んでおきました(赤字で書いた部分がズレている箇所です)。よって、リスト2-1に従って0x62から表示しようとすると、大文字は正しく現れるのですが、小文字はb〜zまでしか表示してくれません。

 正しい出力とするには、12行目を「for (i = 0x61; i <= 0x7A; i++」とすると、a〜zまでが現れます。

 ASCIコード表は、見慣れているので、中身をちゃんとチェックしないことが多いと思います。読者の皆さんの中には、実際にプログラムを走らせて、「あれ、文字コード表の通りなのに、『a』が出てこないぞ。大文字はキチンと表示されるのに」と不思議に思われた人もいるでしょう。

 で、ソースコードを1行ずつチェックしてもバグは見つからず、「ちゃんとコーディングしてあるはずなのに、なぜ、『a』が出てこないんだろう?」と、ちょっとしたパニックになったりします。

 この手の「思い込みがからむ」バグは、なかなか分かりません。前日、普通に帰宅すると、「ガソリンタンクが空っぽ」だとは思いません。100円玉がおでこに貼りついてるとは思いませんね。

 「文字コード変換表は正しい」と思い込むと、そこから抜け出すのは簡単ではありません。逆に、この仕様に「文字コード表」がないと、自分で調べるので、(0161)から表示するようプログラミングするはずです。余計なものがあったため、起きたバグです。仕様を書いた人は、「小さな親切」のつもりで文字コード表を載せたのでしょうが、「大きなお世話」になってしまいました。

5.自己採点シート

 今回の自己採点シートを下記に示します。

問題 内容 配点(点)
文字コード印刷 5分以上考えた 40
コード表のバグに気がついた 40
上記以外のバグを見つけた 20
リスト3 自己採点シート

 この原稿を送った直後、編集部から、「本文に、『ASCIコード』とありますが、『ASCIIコード』ではありませんか?」との問い合わせが来ました。その通りで、私の恥ずかしい記憶違いですが、「仕様書のバグ」として、そのままにしてもらいました。この記述ミスを見つけた方は、「上記以外のバグを見つけた」として、20点加点してください。

6.終わりに

 大前提となる「仕様」も疑いましょう。仕様書に掲載してあるテーブルやデータも、たっぷり疑いましょう。この時に、テーブルやデータのバグを見つけておかないと、プログラムの動作は、手品を見るように不思議な動きをします。実生活でもソフトウェア開発でも、恐るべきは「思い込み」ですね。本コラムをきっかけにして、より高いレベルのエンジニアを目指していただければ幸いです。

【 筆者紹介 】
山浦 恒央(やまうら つねお)

東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)


1977年、日立ソフトウェアエンジニアリングに入社、2006年より、東海大学情報理工学部ソフトウェア開発工学科助教授、2007年より、同大学大学院組込み技術研究科准教授、2016年より非常勤講師。

主な著書・訳書は、「Advances in Computers」 (Academic Press社、共著)、「ピープルウエア 第2版」「ソフトウェアテスト技法」「実践的プログラムテスト入門」「デスマーチ 第2版」「ソフトウエア開発プロフェッショナル」(以上、日経BP社、共訳)、「ソフトウエア開発 55の真実と10のウソ」「初めて学ぶソフトウエアメトリクス」(以上、日経BP社、翻訳)。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.