連載
» 2018年11月21日 10時00分 公開

山浦恒央の“くみこみ”な話(112):バグ検出ドリル(12)コンパイルエラーにならないコンパイルエラー (1/3)

バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第12回は、前回に引き続き「コンパイルエラー」がテーマです。コンパイルエラーにはならないのに、うまく動かないプログラムのバグを見つけ出してください!

[山浦恒央 東海大学 大学院 組込み技術研究科 非常勤講師(工学博士),MONOist]

1.はじめに

 本連載では、エンジニアのバグ検出力の向上を目指し、バグ入りの問題を出題して読者のみなさんに見つけていただいています。本コラムで、「バグ透視能力」を鍛え、トッププロの道を歩んでいただければと思います。

 前回は、コンパイルエラーの問題を出題しました。たくさんの巧妙なエラーを全て見つけられたでしょうか。プロのエンジニアでも、l(エル)と1(イチ)の勘違いや、無意識に全角スペースを入れて不可解なコンパイルエラーに悩まされたことも少なくないはずです。今回は、コンパイルエラーとはならないが、うまく動かない「不思議なバグ入りプログラム」を出題します。

2.コンパイルエラーにならないコンパイルエラー

 プログラマーをやっていれば、誰しもコンパイルエラーに悩みます。コンピュータは、人間の言語のように融通が利かず、「コンパイラにバグがある」と思いたくなります。コンパイラは、プログラムの少しの逸脱も許さずに文法ミスを指摘するため、バグの未然防止の助けになります※1)

※1)飛行機の利点は、「早く移動できる」ですが、これは欠点にもなります。すなわち、「早く飛ばないと墜落する」であり、これを解消するためヘリコプターが開発されました。上記で、「プログラムの少しの逸脱も許さずに文法ミスを指摘する」は、コンパイラの利点ですが、同時に欠点でもあります。人間のように融通が利かないのは、コンパイラをはじめ、ソフトウェアの弱点であり、これを解決する手段として期待されているのがAI(人工知能)でしょう。私は、究極のAIは、「人間のように、うそがつけるソフトウェア」だと考えていますが、「人間の言いつけを守らないコンピュータは役に立つのか?」との思いもあり、複雑な心境です。

マジックのような巧妙なエラー ※写真はイメージです

 大半の記述ミスはコンパイラが指摘してくれますが、コンパイラは、記述方法によってはプログラマーの意図と異なる解釈をし、うまく動かないことがあります。コンパイルエラーにならないコンパイルエラーですね。大部分は、デバッグで気付く単純な間違いですが、デバッグの網をすり抜けると不可解な挙動が起き、悩んだ人も少なくないはずです。

 今回は、「コンパイルエラーとはならないけど、うまく動かないプログラム」を出題します。手品のネタは、分かってしまえば拍子抜けするほど簡単ですが、マジシャンが巧妙に演じると、不思議感が満載ですね※2)。今回のバグは、そんな「マジックのような巧妙なエラー」です。

 問題は、Visual Studio 2010コンソールアプリケーションで作成しています。机上で読んで分からない場合、デバッガなど、あらゆるものを活用して挑戦してみてください。

※2)昔から日本のマジシャンの間で常識となっている「必ず守るべき3つの法則」があるそうです。19世紀のアメリカの有名なマジシャン、ハワード・サーストンの教えといわれている「マジックを演じる前に、現象を説明してはならない」「同じマジックを2度繰り返して見せてはならない」「タネ明かしをしてはならない」の3法則です。これは、ソフトウェアのデバッグでは正反対ですね。「バグの現象をきちんと説明できなければならない」「バグの再現条件を把握し、何回も繰り返して見せねばならない」「バグの原因を明かさねばならない」となります。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.