////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


    (C)KAB-studio 1999 - 2001 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com

    送信日： 2001/07/02(Mon) No.114
    配信数： 3780 ( Mag2 + Pubzine )
＊    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine ( URL: http://www.pubzine.com/  ID: 590 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
/*                ２００１年７月２日（月）の更新                  */
http://www.kab-studio.com/

・７月表紙壁紙登場！
　毎月恒例、新しい表紙壁紙です。夏と言ったら水着でしょう。しかもロー
アングル(爆)。ダウンロードは CG Gallery にて。
[CG Gallery]
http://www.kab-studio.com/CG/Gallery/


////////////////////////////////////////////////////////////////////
/*                        チョー普通な日記                        */
http://www.kab-studio.com/nikki2/

2001/06/24 (Sun)
　高校の時の友人の結婚式へ。オペラシティでしたんだけど、こういう貸し
切りタイプもいいかも。歌が(泣)。そんな感じでテレビ見てないです。そし
てＭ式キーボードと謎のツッコミ。

2001/06/25 (Mon)
　本格的に仕事でプログラミング。でも、気付いた、わてはアプリを作るこ
とが楽しいんじゃなく、プログラムそのものを作ることが楽しいのだ
と……。最後は今日も謎のツッコミ。

2001/06/26 (Tue)
　会社ではツールのマニュアル作成、昼休みに Java メルマガ、帰ってから
はイラスト描き、ごはんは玉子サンド。バラエティ豊か？

2001/06/27 (Wed)
　NT サービスを作成。テストしてから MFC に組み込み。できないと思った
ら簡単？　そして飲み会。

2001/06/28 (Thu)
　サービスのブラッシュアップにマニュアル作り。そして電童最終回。ベタ
っぽいのに謎なアニメだった……。そして ATL サービスはどう？

2001/06/29 (Fri)
　結構仕事疲れたかもー、 Java メルマガが進まない……で、とんでもない
ことを言い出す(汗)。帰りに横浜でラーメン食べて財布買って名刺型 CD-R
買って。そしてザウルス Linux と COM 対 .NET 。

2001/06/30 (Sat)
　７月表紙壁紙完成！　今回は水着でローアングルですよ？　描き方解説も
あり。そして有料メルマガへの熱い想い、 KAB-studio.h 有料化の影……。
あとはウナギとろろや部屋の片付け。


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
http://www.kab-studio.com/Novel/Fuga/

■　第一章　予言と運命　−７−

「こりゃあ当分休みだな……」
　後ろを走ってくる巨大な犬は、廊下の壁にひびを入れながら走ってくる。
まっすぐ走ることができないらしく、そのおかげで俊雄を支えながらの逃走
でも追いつかれることはなかった。
「でも、時間の問題ね」
　舞は振り向き、目の前の化け物を睨み付けた。
「舞さん！」
　三人は振り向く。
「みんなは逃げて！」
　躊躇いがちに、三人はそのまま逃げていった。角に消えるまで、俊雄は後
ろを向き心配そうな顔を向けていた。そして、悔しそうだった。
「たとえ木村君が怪我してなくても、こいつの相手はできないでしょ」
　犬は、舞の目の前で立ち止まった。犬が舞の実力を感じ取っているのか、
それとも、舞がターゲットなのか。
　なんの理由も無く襲われるはずがない。何者かの差し金か……あの少年が
思い浮かぶ。
　舞は、ひとつため息をついた。肩を落としつつ、洗面所に行き、蛇口を捻
る。
　姿勢を正し、息を吸い、止めた。眼前に護符を構える。蛇口から、水が、
ゆっくりと、舞の元に、登って、来る。
『我ここに念を持ち迸る力を一つに纏め我が力の写身と成す！』
　その声と共に水が勢いよく噴き出し、舞の体を包み込んだ。
「ギャヒャア！！」
　鳴き声にしては乱暴なそれを吐き捨て、犬は前足をもたげ、それだけで数
百キロはあるであろうそれを振り降ろした。
『護る力我が前に！』
　衣のようになっていた水流が瞬時に壁となって舞の頭上を覆った。前足が
そこへ突っ込み、そして鳴き声と共にすぐに引っ込めた。宙に舞う透明と鮮
赤の水粒。
「あたしにも楽な相手じゃないか……」
　水の壁に裂け目が現れ、舞の顔を露わにした。その眉間に、血の流れが生
まれる。舞は小さめの護符を取り出し、額に貼った。
『癒やしを我が元に……血の流れよ、時に傷を治し、時に休め』
　その言葉が血の流れを止める。だが、傷口は熱く、体力は想像以上に消耗
していた。荒い息が、すぐ側の水流を乱すほどだった。
「ちゃんと休息はとったのにな……寝過ぎたかな？」
　才能だけでは勝てない。碧き泉がもたらす力には限界がある――もし真面
目に修練していれば、その限界は大きく引き上げることができるはずだっ
た。
　怠けてた。逃げてた。でも、こんな瞬間があるとは思わなかった。あた
し、なんでこんなところで戦っているんだろう。
　縦に大きく広がった顎を見た瞬間、三枚の札を飛ばし、それを通過するよ
うに水が流れる。三角形の水流が顎を弾き、舞は大きく後ろへと跳ぶ。
　舞と犬の目があった。舞は苦笑する。どう理由をつけようと、力があるか
らこそ戦っている。戦えるからこそ、ここにいる。
「なんだかんだ言っても、あたしって好戦的かもね」
　犬は一瞬後ずさり、顎を引き、爪を廊下に引っかけた。感じて、舞は廊下
に護符を投げ付ける。水流がそれを追い、廊下に水の槍が突き刺さりそれを
避けて犬は足を引っ込める。立て続けて水槍が突き刺さっていき、それと共
に舞と犬の距離は離れていく。
　肩に掛ける水筒へとおもむろに手を伸ばす。弾け飛ぶ蓋と共に現れた、清
められた水。
『碧き閃光疾る道、見えない道を造り上げ、その弾丸よ我が前に集え』
　犬に対して半身になる舞。その前に三つの輪が現れ、その一番後ろに水筒
の水が集まっていく。犬が、遠くで吠えている。何かを感じているのかもし
れない。
『時をも凌駕する蒼白き閃光を我が前に現せ、何よりも速い碧槍と成りて我
が力の偉大さを知らしめよ！！』
　舞の声が廊下に響きわたり、目の前の水が球形を形作りながらも波打ち振
動する。その振動波がまるで校舎全体を揺らしているかのように空気が震
え、鳴動した。
　負けじと吠え続けていた犬は、意を決した。舞目掛けて一気に廊下を走り
だし、その巨体の動きで廊下が揺れる。それだけで窓ガラスが揺れるほど
だった。
　だが、舞は臆しなかった。跳び退いたのも牽制したのも、これから使う能
力を邪魔されないだけの距離を取るためだった。布石は十分だった。
　今のあたしは戦士。相手が誰だろうと何者だろうと関係ない、ただの野蛮
な、狂戦士。遙か古代の遺物かもね……。
　苦笑いを消し、地響きを立てて迫ってくる毛玉を睨み付けた。
『自らを、解き放て』
　その低い声が引き金。水の塊は球から卵となり、先が細くなって護符の輪
を一つずつ通り抜けていくと思った瞬間、水は吸い込まれ消えていた。瞬
間、まさに蒼い閃光とでも呼べる一直線の細い槍が舞の元から犬の肩先まで
届き、そして貫いた。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『作者、煮え切らん〜、いっそのこと会社やめれ！』
「な、何言ってるの？」
『作者が創作やめたら、あたし達消えちゃうのよ！？』
「まぁそりゃそうだけど、辞めないでしょ」
『会社？』
「創作の方。会社もだろうけどね」
『なんでそんな確信あるの？』
「今、定期的に更新してるのって？」
『……このメルマガ、月１の壁紙、あとまだだけど４コマとか？』
「前に比べたらぐっと減ってるわけで」
『そういうのの管理はできてるってこと？』
「まずくなったら、うまく減らしてくでしょ、壁紙とかぷらとわとか」
『どっちもあたしのやん！』
http://www.kab-studio.com/
_______________________________________________________________[KCM]


////////////////////////////////////////////////////////////////////
/*                       #pragma twice                            */
http://www.kab-studio.com/Programing/PragmaTwice/

　Version 6.14
オーバーフローに要注意！

「今回は、前回の続きのようなそうじゃないような」
『何それ』
「今回は〈オーバーフロー〉って問題について紹介するんだけどそれが前回
の演算子関係と少なからず関係があるんだよね」
『でもずばり関係してる、ってわけでもないのね』
「そゆこと。まずはオーバーフローの例から見てもらいましょう」

void CDebugDlg::OnButton1() 
{
    char ch = 10;
    for( int i = 0; i < 10; i++ )
    {
        TRACE( "%d ", ch );
        ch *= 10;
    }
    // 10 100 -24 16 -96 64 -128 0 0 0 
}

『えーっと、 10 ずつ増やしていったら……値が変になってるね』
「そう、これは char の上限 127 を超えたから。こういう〈変数の上限を
超えること〉を〈オーバーフロー〉って言います。日本語だと〈桁溢れ〉。
overflow って言うのは〈溢れる〉って意味だから」
『お風呂に入ったらお湯がざばー、って感じね。でもさ、このエラーって当
たり前じゃない』
「当たり前なんだけど、だからこそ気を付けないと。たとえば」

char Plus( char p_chLh, char p_chRh )
{
    return p_chLh + p_chRh;
}

「って関数のことを考えてみて。 char の上限は 127 。もし p_chLh に 
127 、 p_chRh にも 127 が入ってたら？」
『あ、戻り値で溢れちゃうね』
「変数だとどんな値が入ってるかわかんないから、こういうことがあるんだ
よね」
『こういうのって char だからなんじゃないの？　int だったら大丈夫そう
だけど』
「うん、 int だと安全性は増す、けど、可能性はなくならないから。たと
えばさっきの for みたいな例。ちょっとミスして 100 回ループさせたり、
while なんかでその都度ループ回数が違うときなんかに」
『うっかり無茶苦茶ループさせちゃったりしたらこうなっちゃうわけね』
「ただ、この種類のオーバーフローは、直接的な問題はないかな」
『ないの？　あのさ、オーバーってことは、他の変数が置いてあるメモリ領
域とかに書き込んじゃったりしない？』
「うん、それはないんだよね。実行するときにちゃんと char に入るように
切りつめられちゃうから。メモリ見るとわかるよ」
『 TRACE でアドレスだして、メモリ見て……』
「そんなに問題ない、っていうのは整数リテラルだと分かりやすいかも」

void CDebugDlg::OnButton1() 
{
    char ch = 1000000000;
    // warning C4305: 
    // 'initializing' : 'const int' から 'char' へ切り詰めます。
}

『あ、エラーだ』
「エラーじゃないよ、これは警告。値が変になってますよーって教えてくれ
るだけで、コンパイルは通ってるわけ」
『ってことは、こういうのってそんなに危なくない？』
「一応ね。ビット操作っぽい理由でわざとこういうことすることもあるし。
でも直接問題ないってだけで、間接的に問題になることは多いよ」
『そりゃそうよ、変な値になっちゃうんだもの』
「というわけで、もう少し詳しく見ていきましょう。オーバーフローになる
可能性があるのは、なんと言っても四則演算」
『引き算とかはならなさそうだけど？』
「 char に入れるときに 127 - ( -127 ) だったら？」
『げ、そういえば - と - で + ね』　　　　　　　　　　　　　　　　　　　　　　
「四則演算するときには、オーバーフローの可能性を常に気にした方がいい
かもね。調べ方は、こんな感じ」

void CDebugDlg::OnButton1() 
{
    char ch1 = 100;
    char ch2 = 100;
    if( ( 127 - ch1 ) < ch2 )
    {
        TRACE( "オーバーフローします。\n" );
    }
}

『んーと、 127 は char の最大数だよね。そっか、それから引けば、残り
が分かるんだ』
「そう、こうすれば〈余ってる範囲〉が分かるから、そこに入るかどうか
チェックすればいいわけ」
『……でもさ、はっきし言って計算するたびにこれするの大変だよ？』
「実際そうだね。そうなると、普通は int とかのある程度大きなサイズの
変数を使っておいて、あとは場面を絞ってチェックする感じかな」
『場面ってどんな？』
「まずはさっき言った for とかのループ系」
『 10 が 100 に変わってもかなり違うもんね』
「次に複雑な計算。でもこれはあんまないか」
『ないの？』
「普通 int じゃなく double って実数型使うからね」
『 double ってあんま使ったことない……』
「あと重要なのは入力系」
『入力って言うと、ダイアログボックスとかに？』
「そうそう。エディットボックス貼り付けて入力してもらう部分。こっちは
少ない数字を想定してても、使ってる人が誤ってかわざととかで大きな数字
入れちゃったら」
『そりゃまずいね』
「ま、それもあって MFC には自動チェックの機能が着いてるんだけど。ダ
イアログエディタでエディットボックスを貼り付けて、そのメンバ変数をク
ラスウィザードで作ってみて。変数名は適当、【変数のタイプ】は int 」
『ほい。あ、【 MFC ClassWizard 】の下の方に【最小値】と【最大値】っ
てのができた。これで上限と下限を決められるの？』
「そ。とりあえずこれで制限できるから。こういうのも使って防ぐことにな
るかな」
『オーバーフロー自体はそんな危なっかしくないね。ん？　なんか罠の予
感。そういえばさっき〈この種類のオーバーフローは〉とか言ってたね』
「そう、実は他に、危険なタイプのオーバーフローがあるんです。それは、
ポインタや配列を使ったときのオーバーフロー。まずはこの例」

void CDebugDlg::OnButton1() 
{
    char ch[3];
    TRACE( "%X\n", ch );
    strcpy( ch, "123456789!" );
}

『ビルドして実行、あ、エラー』

ハンドルされていない例外は Debug.exe (MFC42D.DLL)にあります。
0xC000005: Access Violation。　

『ってゆーか、 strcpy() って、文字列コピーするランタイムだよね。こ
れって 3 文字しか入らないとこに 10 文字入れてるんだから、エラーにな
るの当たり前のような……』
「そう、確保してるサイズを超えて書き込んじゃってます。アドレス表示さ
せてるのは、実際にメモリのその部分を見て欲しいから」
『あ、そっか。 Ver 4.02 ( No.052 ) とかでやったのね。ブレークポイン
トを置いてアドレスをメモリウィンドウに入れてリターン』

0064F4F4 31 32 33 34 35 36 37 38 39 21 00 00 9C 74 43 5F 9C F7 64 00
         123456789!..徼C_戈d.

『あーあー、思いっきりはみ出ちゃって……あ、これがオーバーフローって
事？』
「そゆこと。実際の配列のサイズを超えて書き込んじゃうのもオーバーフ
ローの一種で〈バッファオーバーフロー〉って言います」
『バッファってどっかで聞いたような……』
「 buffer は〈緩衝材〉って意味で、とりあえず値を受け取るための変数、
って意味。でも実際は、文字列を受け取る配列だけを〈バッファ〉って言う
ことが多いかな」
『サンプルとか見ても、文字配列が buf って変数になってること多いけ
ど、それ？』
「そうそれ。もひとつ付け加えると、配列を超えた部分にアクセスすること
をオーバーランって言います」
『それはフツーな用語だね』
「ま、そういうのもね。で、このバッファオーバーフローは絶対回避しな
きゃいけない問題。特に、運悪くエラーにならないことがあって、それで
見つからない場合が多いんだよね」
『こういうエラーが出たらむしろ幸運？』
「まー幸運ってゆーか……実際にはエラーが出る前に回避しないとね。特に
バッファオーバーフローは〈わざと〉起こされることがあるから」
『わざと？？』
「バッファオーバーフローの対策をしてないと、わざとながーい文を入力さ
れて、それで普通の変数とか、プログラムを動かすのに重要な変数とかが書
き換えられちゃうことがあるんだよね」
『げ、それってかなりヤバくない？』
「やばいよ。だから、バッファオーバーフローの対策は絶対しないとダメ」
『対策ってゆーと、文字列のサイズを調べればいいんだよね』
「そう。書き込み先の配列、この例だと ch だね、そのサイズが分かってれ
ば足してそのサイズに入り切るか調べればいいわけ」
『あ、分かればいいけど、ポインタとかになってて分かんないときは？』
「分かんなかったらアウト。だから、分かるようにする必要があるんです。
たとえば……そうだね、 CDebugDlg::OnButton1() の中に、ダイアログのタ
イトル char 配列で受け取って TRACE() で出力するコード書いて」
『ほいほい、 GetWindowText() だったよねウィンドウタイトル取得するの
って。 CDebugDlg は CWnd のも使えるから、そのまんま呼んで……あ、
そーか』

void CDebugDlg::OnButton1() 
{
    char ch[256];
    GetWindowText( ch, 255 );
    TRACE( "%s\n", ch );
}

『関数に渡すときは、配列のサイズ渡すんだ。そうすればはみ出ることない
もんね』
「そゆこと。文字列を返すような関数を作る時とかはこれを守るようにね」
『守ってない strcpy() とかは？』
「もちろん使う時にサイズのチェック。ってゆーか、整数のオーバーフロー
の時と同じで、別に切り捨てられたからいいってもんじゃないでしょ」
『そっか、上の GetWindowText() でも、オーバーランしてないからって切
り捨てられてたらダメだもんね』
「ま、場面場面で違ってくるけど、この例だと GetWindowTextLength() 
って API があって」
『へー、これで文字列のサイズを受け取れるんだ。でも配列じゃどーしよー
もないじゃん』
「まだ教えてないけど、自由にサイズを決めて配列もどきを作ることができ
るから、それで受け取ればＯＫ。その機能が入ってるのが CString 」
『そういえば CString なら strcpy() 使わなくても文字列のコピーできる
ね』
「さっきの文字列を返すのでも、 CString は引数から参照を通してや戻り
値として返せるから、そっちの方が安全かつ便利かもね」
『結局はそういう便利なのを使おうって話ね』
「そゆこと」

/*
    Preview Next Story!
*/
『そういえばバッファオーバーフローってよく聞くよね』
「そう、この対策をしてないアプリが多くてね」
『有名なの多いよね。それがさっき言ってたわざとなんかされちゃう？』
「そゆこと」
『結構てきとーな作りなの多いのねー』
「というわけで次回」
＜ Version 6.15 バグをコンパイルタイムエラーで防ぐ！ ＞
『につづく！』
「でも有名アプリがそうだからって、自分のもいいとか」
『思わないだよーだ』


////////////////////////////////////////////////////////////////////
/*                ２００１年７月９日（月）の更新予定              */
http://www.kab-studio.com/

・更新なし
　更新の次はお休み。でも、なーんかメルマガ関係でごたごたが……？


////////////////////////////////////////////////////////////////////
/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.com/nikki2/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://backno.mag2.com/reader/Back?id=0000012198
http://www.kab-studio.com/Freeware/index.html#MailMagazine


////////////////////////////////////////////////////////////////////
/*
    KAB-studio.h
      Weekly Mail Magazine.
      Written by Kaburaya Seiden.
      http://www.kab-studio.com/Info/MailMagazine/

    (C)KAB-studio 1999 - 2001 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com
*/
////////////////////////////////////////////////////////////////////




