Version 6.01
バグってなに?
『 KAB-studio.h 3周年目に突入! #pragma twice も Ver 6 に!』
「……なんかシャレになんないくらい、長い時間掛かってるような……」
『ま、最後まで付き合ったげるから気にしない気にしない! で、今回から
は何教えてくれんの?』
「 Ver 6 では〈バグ〉と〈デバッグ〉ってものについて」
『バグってゲームでよく聞くよね、よーするにプログラムのミスってヤツで
しょ』
「そうなんだけど、この辺をもうちょっとしっかりはっきりしておきましょ
う。えーっと、まずビルドについて」
『ビルド? いつもフツーにしてるじゃん』
「実はその〈フツーにしてる〉のは、いろんなことを自動化してるから〈フ
ツーにできてる〉んです」
『ってことは、ホントはボタンひとつでできることじゃないってこと?』
「そういうこと。じゃ、まずは今回用のプロジェクトを作っちゃおうか。い
つもどおり MFC 使うのでダイアログので作って」
『ほい。とりあえず Ver 5.01 ( No.066 ) の時と同じよーに作るね。プロ
ジェクト名は…… Debug にしよっと』
「作ったらとりあえずビルド」
『ほい』
--------------------構成: Debug - Win32 Debug--------------------
リソースをコンパイル中...
コンパイル中...
StdAfx.cpp
コンパイル中...
Debug.cpp
DebugDlg.cpp
コードを生成中...
リンク中...
Debug.exe - エラー 0、警告 0
『そういえば、ビルドってしてる間にも色々としてるんだね』
「基本的には、ビルドは2段階の処理を含んでます。まず〈コンパイル〉」
『のーみそこねこね』
「そう、その会社の元ネタがこれね」
『う”、ボケになんなかった……』
「火美ちゃんなんかが書いたプログラムを、コンピューターが理解できる形
式に変換することが〈コンパイルする〉ってことです」
『そういえば、前に Exe を16進形式で見たことあったよね。よーするに
あーゆー形にすることを〈コンパイルする〉っていうんだ』
「そういうこと」
『あれでも、そういうふうにすることがビルドってことだと思ってたんだけ
ど』
「実は、コンパイルは、各ソースファイルごとにしかされないんです。って
ことは、最後にそれを全部くっつけて、ひとつの Exe にする必要があるん
です。それを〈リンクする〉って言います」
『トライフォースを集めて~って』
「それもそうなんだよね……」
『ええっ?』
「トライフォースを〈継なぎ合わせてひとつにする〉からリンクって名前に
したんだって」
『実はゲーム業界って、プログラミング用語ばっか?』
「特に昔はね……。で、ここではとりあえず〈ビルド=コンパイル+リンク〉
ってことだけ憶えておいて」
『それが後々重要?』
「っていうか今重要。前に教えた〈テストアプリの作り方〉のとおり、ダイ
アログにボタン追加してメンバ関数作って」
『 Ver 4.01 ( No.051 )のときのね。あ、1年前だ』
void CDebugDlg::OnButton1()
{
}
「とりあえずこれをこう書き換えて」
v0id CDebugDlg::OnButton1()
{
}
『どこ違う?』
「 void を v0id に。こうやって、わざとエラーを出してみて」
『あ、そういうことか。ビルドっと』
--------------------構成: Debug - Win32 Debug--------------------
リソースをコンパイル中...
コンパイル中...
DebugDlg.cpp
DebugDlg.cpp(173) : error C2143: 構文エラー : ';' が 'tag::id'
の前に必要です。
DebugDlg.cpp(173) : error C2501: 'v0id' : 識別名を宣言するのに、
型が指定されていません。
DebugDlg.cpp(173) : fatal error C1004: 予期せぬ EOF が検出されました。
コードを生成中...
コンパイル中...
Debug.cpp
コードを生成中...
cl.exe の実行エラー
Debug.exe - エラー 3、警告 0
『注:横に入りきらないから勝手に改行とかしてます!』
「で、こういうエラーを〈コンパイル中に出たエラー〉だから〈コンパイル
エラー〉って言います」
『コンパイルエラー、ってそのまんまね』
「じゃ次。今の元に戻して」
void CDebugDlg::OnButton1()
{
}
「これ全部削除してからビルドして」
『ほい』
--------------------構成: Debug - Win32 Debug--------------------
コンパイル中...
DebugDlg.cpp
リンク中...
DebugDlg.obj : error LNK2001: 外部シンボル ""
protected: void __thiscall CDebugDlg::OnButton1(void)"
(?OnButton1@CDebugDlg@@IAEXXZ)" は未解決です
Debug/Debug.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー
Debug.exe - エラー 2、警告 0
『を、今回はリンク中だからリンクエラー?』
「その通り。こういうリンク中に発生したエラーを〈リンクエラー〉ってい
います」
『なるほど。削除、元に戻しとくね』
「うん。さて! ここが重要。〈コンパイルエラー〉と〈リンクエラー〉、
このふたつは〈バグ〉と言いません!!」
『え? なんで? プログラムのミスじゃん』
「このふたつのエラーだと、 Exe ができないでしょ。そういうエラーはバ
グって言わないんです」
『じゃ、何をバグって言うの?』
「たとえばこういうの」
void CDebugDlg::OnButton1()
{
int *pi = NULL;
*pi = 100;
}
『えーっと、 int のポインタ作ってそれを NULL で初期化して、そのポイ
ンタが指し示すとこに 100 を……って、 NULL なんだからダメじゃんこ
れ。あ、これがバグの例なんだもんね』
「そう。これをビルドすると」
『エラーになんない』
「実行すると?」
『ダイアログ出た』
ハンドルされていない例外は Debug.exe にあります
0xC0000005: Access Violation
『なんか怒られた……これどうすればいいんだっけ』
「 OK 押してダイアログ閉じてから、【デバッグの中止】ボタン押して」
『【デバッグの実行】にバツついてるのね』
「終了させたら、今度は Debug.exe を直接実行してみて」
『直接?』
「プロジェクトのフォルダ開いて、その Debug フォルダに Debug.exe があ
るでしょ、それをダブルクリック」
『ダブルクリックしてボタン押して……うお、なんか嫌なダイアログが!!』
このプログラムは不正な処理を行ったので強制終了されます。
終了しない場合は、プログラムの製造元に連絡してください。
「と、こういうふうに胃の痛くなるダイアログが出ます。ちなみに【デバッ
グ】ボタンを押すと」
『ん? VC が立ち上がって……さっきの〈ハンドルされてない~〉が出た』
「こういうふうに、 VC を経由するとこういうチェックができます」
『で、こういう実行中に出るのが、ホントのバグっていうのね』
「いや、正確には〈ランタイムエラー〉って言います」
『ランタイムって』
「あのランタイム関数とかとは別物。このランタイムはその名の通り」
『実行中のエラー、ってことね』
「このランタイムエラーはバグの一種。つまり他にもバグの種類があるって
こと」
『どんなの?』
「たとえば……」
void CDebugDlg::OnButton1()
{
while( 1 )
{
}
}
『あ、無限ループだ』
「これはさっきみたくダイアログは出ないけど、動かなくなっちゃうってい
う点でバグ」
『他には?』
「その他、テキスト表示の中の誤字脱字、マニュアル通りに動かない、とか」
『わかった! つまり、一応実行はできるんだけど思い通りに動いてくんな
い、っていうのをバグって言うんだ』
「そういうこと!」
『じゃ、実行することさえできないコンパイルエラーとリンクエラーはバグ
じゃない、ってことになるわけね』
「ちなみに bug っていうのは〈虫〉って意味」
『虫?』
「コンパイルエラーとリンクエラーは簡単に見つけられるけど、ランタイム
エラーは場所が特定しにくいわけ。それを比喩して、プログラムのどっかに
蟲が蠢いている、と……」
『うわ、なんか嫌……』
「ってのはちょっとウソ入ってるんだけどね」
『なんですと!?』
/*
Preview Next Story!
*/
『水希ちゃんのウソツキ!』
「ま、今はこの意味の方が良く知られてるけどね」
『じゃ、ホントはなんで bug っていうの?』
「本当に、虫が回線に触れてショートして誤作動した、って話」
『……それウソでしょ』
「ホントだって」
『どうかなー』
「というわけで次回」
< Version 6.02 コンパイルエラーをなくす! >
『につづく!』
「ちなみにその虫がスミソニアン博物館に飾られてます」
『それはウソ!! 絶対!』
「 http://americanhistory.si.edu/csr/comphist/objects/bug.htm 」
『……はぅん……』