バグ検出ドリル(5)「小さな親切、大きなお世話」な問題:山浦恒央の“くみこみ”な話(105)(3/3 ページ)
「バグ検出ドリル」の第5回で出題するのは「思い込み」にまつわるバグの問題です。タイトルの「小さな親切、大きなお世話」とは一体何なのでしょうか。問題文から、どこにバグがありそうか見つけ出してみよう!
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.終わりに
大前提となる「仕様」も疑いましょう。仕様書に掲載してあるテーブルやデータも、たっぷり疑いましょう。この時に、テーブルやデータのバグを見つけておかないと、プログラムの動作は、手品を見るように不思議な動きをします。実生活でもソフトウェア開発でも、恐るべきは「思い込み」ですね。本コラムをきっかけにして、より高いレベルのエンジニアを目指していただければ幸いです。
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- バグ検出ドリル(4)プログラミングの素質を試すのに最適!? FizzBuzz問題に挑戦
「バグ検出ドリル」の第4回で出題するのは、プログラミングの素質を試すのに最適といわれる伝説の「FizzBuzz問題」。問題文から、どこにバグがありそうか見つけ出してみよう! - バグ検出ドリル(3)それでもプログラマーは数学を知っておくべきだ
「バグ検出ドリル」の第3回で出題するのは、前回に引き続き数学に関係する問題。理系とはいえ必ずしも数学が得意ではないプログラマーですが、やはり数学を知るメリットは絶大。これまでと比べてかなり歯ごたえ十分な問題を用意したので、じっくり取り組んで数学に対する免疫力をつけてみよう! - バグ検出ドリル(1)「さあ、バグを見つけよう」
記念すべき連載第100回を突破した「山浦恒央の“くみこみ”な話」。今回の第101回からは、新シリーズ「バグ検出ドリル」が始まります。山浦氏が出題する問題に取り組んで、バグを見つけ出す力を養おう! - 組み込みソフトがこの10年で変わったこと、変わらないこと
MONOist開設10周年に合わせて、MONOistで記事を執筆していただいている方々からの特別寄稿を掲載していきます。第1弾は、間もなく連載100回を迎える「“くみこみ”な話」を執筆していただいている山浦恒央氏の寄稿です。