バグ検出ドリル(14)タイポグリセミア現象もびっくり、恐るべきは思い込み:山浦恒央の“くみこみ”な話(114)(3/3 ページ)
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第14回の問題は、前回に続いて「煮詰まったバグ」です。煮詰まっているがゆえに、バグの原因が分からなくなる事態に対処してください!
4.今回の解答
今回のバグは、「sizeof関数で配列のサイズを取得している」です。
本問題は、変数str1に代入した文字列の文字数を、sizeof関数から取得し、表示しています。A君のミスは、sizeofは、配列のサイズを取得する関数であり、文字数を取得する関数ではないと気づいていないことです。
修正方法は、sizeofの部分をstrlen関数に置き換えると、ヌル文字の1つ手前までの数を取得できます※3)。よって、A君はsizeofとstrlenを勘違いして使用している可能性があります。
読者の方から見れば、「そんなの当たり前」と思われたはずです。A君から見ると、文字数取得ならsizeofと頭に刷り込まれてしまっている可能性があります。問題の複雑さは異なるでしょうが、後々気付くと恥ずかしくなるようなミスでも、煮詰まると分からなくなることが度々あります。特に、「思い込み」は、難解なバグにつながります。
※3)strlenは、文字列の長さを取得する標準関数です。#include<string.h>でインクルードすると使用できます
5.自己採点シート
今回の自己採点シートを以下に示します。
問題 | 内容 | 配点(点) |
---|---|---|
文字数表示プログラム | 問題文を一通り読んだ | 50 |
sizeofとstrlenを取り違えていることが原因だと推察できた | 50 | |
リスト3 自己採点シート |
6.終わりに
プログラミングは、非常に創造的で楽しい作業ですが、想定通りにいかない時は非常に苦しい時間です。特に、思い込みがあったり、煮詰まったりすると視野が狭まり、当たり前のことが見えなくなります。
今回は、文字数表示プログラムを題材としました。皆さんならば、今回のような話で困ることはないでしょうが、「煮詰まった」と自覚した時は誰かと相談し、「第三者の目」で見てもらって、早めに問題を解決しましょう。
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「山浦恒央の“くみこみ”な話」バックナンバー
- バグ検出ドリル(13)のたうち回る地獄、煮詰まったバグを解決せよ
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第13回の問題は、筆者の経験を基にして作った「煮詰まったバグ」です。プログラムが思い通りに動かず「のたうち回る地獄」のような状況に対処してください! - バグ検出ドリル(12)コンパイルエラーにならないコンパイルエラー
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第12回は、前回に引き続き「コンパイルエラー」がテーマです。コンパイルエラーにはならないのに、うまく動かないプログラムのバグを見つけ出してください! - バグ検出ドリル(11)コンパイルエラーは意外に難しい
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第11回では、初心者が苦労する「コンパイルエラー」がテーマです。コンパイラが指し示すエラーの箇所から、バグを見つけ出してください! - バグ検出ドリル(10)“昔のバグ”は生命力が最強
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第10回では、生命力最強という“昔のバグ”がテーマです。前回の第9回で扱った迷路探索プログラムの改造版からバグを見つけ出してください! - バグ検出ドリル(9)デバッグの基本的な心構えは「人を見たら泥棒と思え」
バグは至るところに、しかも堂々と潜んでおり、自信満々なプログラマーほど、目の前のバグに気付かないものです。「バグ検出ドリル」の第9回では、比較的大きなソースコードである迷路探索プログラムに潜むバグを見つけ出してください!